diff --git a/cron-docker/Dockerfile b/cron-docker/Dockerfile deleted file mode 100644 index 198a948..0000000 --- a/cron-docker/Dockerfile +++ /dev/null @@ -1,69 +0,0 @@ -# 使用稳定版本的 alpine -FROM alpine:3.18 - -# 1. 安装运行时依赖并设置时区 (合并为一层) -RUN apk update && \ - apk add --no-cache \ - tini \ - dcron \ - wget \ - curl \ - jq \ - git \ - tzdata && \ - # 设置时区为东八区 (Asia/Shanghai) - cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ - echo "Asia/Shanghai" > /etc/timezone && \ - # 清理 apk 缓存 - rm -rf /var/cache/apk/* - -# 2. 安装mdbook -# 建议使用 ADD 命令,它可以自动解压 tar.gz 文件 -ADD mdbook-v0.4.51-x86_64-unknown-linux-musl.tar.gz /tmp/ -RUN mv /tmp/mdbook /usr/local/bin/mdbook && \ - chmod +x /usr/local/bin/mdbook - -# 3. 创建工作目录 -WORKDIR /app - -# 4. 复制你的书籍源文件和脚本 -COPY scripts/ /app/scripts/ -COPY entrypoint.sh /usr/local/bin/entrypoint.sh - -# 5. 赋予脚本可执行权限 (合并为一层) -RUN chmod +x /app/scripts/* /usr/local/bin/entrypoint.sh && \ - # 确保子目录中的脚本也有权限 (如果存在) - if [ -d /app/scripts/work ]; then chmod +x /app/scripts/work/*; fi - -# 6. 将 cron 任务写入配置文件 -# 使用 echo -e 来处理换行符,更清晰 -RUN echo "0 8 * * * /app/scripts/build.sh /app/scripts/work >> /proc/1/fd/1 2>> /proc/1/fd/2" > /etc/crontabs/root && \ - # crontab 文件权限必须是 600 - chmod 600 /etc/crontabs/root - -# 7. 设置环境变量 -# 设置时区环境变量,供应用程序读取 -ENV TZ=Asia/Shanghai -# 项目所属 -ENV OWNER="justlovemaki" -# 项目名称 -ENV REPO_NAME="CloudFlare-AI-Insight-Daily" -# 个人访问Token (警告: 不建议硬编码Token,最好通过构建参数或运行时环境变量传入) -ENV GITHUB_TOKEN="github_pat_xxxxxx" -# 图片代理路径 -ENV IMG_PROXY_URL="https://autoproxy" - -# 8. 启动 cron 服务 -# entrypoint.sh 将会执行初始化任务,然后启动 CMD 中的命令 -ENTRYPOINT ["/sbin/tini", "--","/usr/local/bin/entrypoint.sh"] - -# crond -f 让 cron 在前台运行,这是容器化应用的最佳实践 -CMD ["crond", "-f", "-l", "8"] - - -# 构建镜像命令 docker build -t ai-daily-cron-job . -# 启动容器命令 docker run -d --name ai-daily-cron ai-daily-cron-job -# 调试容器命令 docker run -it --rm --entrypoint /bin/sh ai-daily-cron-job -# 调试生成脚本 /app/scripts/build.sh /app/scripts/work -# 进容器调试 docker exec -it ai-daily-cron /bin/sh - diff --git a/cron-docker/entrypoint.sh b/cron-docker/entrypoint.sh deleted file mode 100644 index fd5cec5..0000000 --- a/cron-docker/entrypoint.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -# 退出脚本,如果任何命令失败 -set -e - -echo "--- 容器启动,执行初始化任务 ---" - -# 检查构建脚本是否存在 -if [ ! -f "/app/scripts/build.sh" ]; then - echo "错误: 构建脚本 /app/scripts/build.sh 未找到!" - exit 1 -fi - -# 1. 在容器启动时立即执行一次构建 -echo "执行首次构建..." -/app/scripts/build.sh /app/scripts/work - -echo "--- 初始化完成,启动 cron 服务 ---" - -# 2. 执行 Dockerfile CMD 中定义的命令 (即 "crond -f -l 8") -# exec 会用 CMD 的命令替换当前的 shell 进程, -# 使得 crond 成为容器的主进程 (PID 1),能够正确接收和处理信号。 -# 这是保持容器运行的关键。 -exec "$@" \ No newline at end of file diff --git a/cron-docker/mdbook-v0.4.51-x86_64-unknown-linux-musl.tar.gz b/cron-docker/mdbook-v0.4.51-x86_64-unknown-linux-musl.tar.gz deleted file mode 100644 index 169f582..0000000 Binary files a/cron-docker/mdbook-v0.4.51-x86_64-unknown-linux-musl.tar.gz and /dev/null differ diff --git a/cron-docker/scripts/build.sh b/cron-docker/scripts/build.sh deleted file mode 100644 index fb233cd..0000000 --- a/cron-docker/scripts/build.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/sh - -# set -e: Exit immediately if a command exits with a non-zero status. -# set -o pipefail: The return value of a pipeline is the status of the last command to exit with a non-zero status. -set -e -set -o pipefail - -# --- Configuration --- -REPO_NAME=${REPO_NAME} -REPO_URL="https://github.com/${OWNER}/${REPO_NAME}" -# --------------------- - - -# 1. Validate Input Parameter -# Check if the working directory argument is provided. -if [ -z "$1" ]; then - echo "Error: Working directory not provided." - echo "Usage: $0 " - exit 1 -fi - -WORK_DIR="$1" - -# Check if the provided working directory exists. -if [ ! -d "$WORK_DIR" ]; then - echo "Error: Directory '$WORK_DIR' does not exist." - exit 1 -fi - -echo "--- Starting AI Today workflow in '$WORK_DIR' ---" - -# 2. Change to the working directory. All subsequent operations will be relative to it. -cd "$WORK_DIR" - -# 3. Cleanup: Remove the old repository directory to ensure a fresh start. -echo "--> Cleaning up old directory..." -rm -rf "$REPO_NAME" - -# 4. Fetch: Clone the latest content from GitHub. -echo "--> Cloning repository from $REPO_URL..." -git clone "$REPO_URL" - -# Define the path to the cloned repository for easier access. -PROJECT_DIR="$WORK_DIR/$REPO_NAME" - -# 5. Preprocessing: Prepare the cloned content. -echo "--> Preprocessing content..." -# Detach from Git history by removing the .git directory. -rm -rf "$PROJECT_DIR/.git" -# Remove any old generated content. -rm -rf "$PROJECT_DIR/today" -rm -rf "$PROJECT_DIR/src" -rm -rf "$PROJECT_DIR/prompt" -rm -rf "$PROJECT_DIR/podcast" - -# Execute custom processing scripts. -# Note: Ensure 1.replace.sh and 2.gen.sh are in the $WORK_DIR or in your PATH. -echo "--> Running custom scripts..." -./replace.sh "$PROJECT_DIR/daily" -./gen.sh "$PROJECT_DIR/daily" -mdbook build "$WORK_DIR" - -# 6. Package & Upload -echo "--> Waiting for generation to complete..." -# This pause assumes the generation script might have background tasks. -# A more robust solution would be to wait for a specific file or process. -sleep 10 - -echo "--> Packaging the 'book' directory..." -# Create a gzipped tar archive of the 'book' directory's contents. -tar -cvf archive.tar.gz book/* - -echo "--> Uploading the archive..." -# Upload the archive using a custom script. -# Note: Ensure github.sh is in the $WORK_DIR or in your PATH. -./github.sh upload "archive.tar.gz" "today/archive.tar.gz" "pushbook" - -echo "--- Workflow completed successfully! ---" \ No newline at end of file diff --git a/cron-docker/scripts/work/book.toml b/cron-docker/scripts/work/book.toml deleted file mode 100644 index 0c5830d..0000000 --- a/cron-docker/scripts/work/book.toml +++ /dev/null @@ -1,6 +0,0 @@ -[book] -authors = [] -language = "zh" -src = "CloudFlare-AI-Insight-Daily" -title = "By 何夕2077" -create-missing = true \ No newline at end of file diff --git a/cron-docker/scripts/work/gen.sh b/cron-docker/scripts/work/gen.sh deleted file mode 100644 index ffe516a..0000000 --- a/cron-docker/scripts/work/gen.sh +++ /dev/null @@ -1,136 +0,0 @@ -#!/bin/sh -# 这是一个兼容 POSIX sh 的脚本,用于从日刊 Markdown 文件生成一个摘要文件。 - -# 检查是否提供了目录参数 -if [ -z "$1" ]; then - echo "用法: $0 <存放markdown文件的目录路径>" - echo "例如: $0 path/to/your/daily_notes" - exit 1 -fi - -TARGET_DIR="$1" # 例如 path/to/your/daily_notes - -# 1. 确定 TARGET_DIR 的父目录 和 TARGET_DIR 的基本名称 -# dirname 和 basename 是 POSIX 标准工具 -PARENT_OF_TARGET_DIR=$(dirname "$TARGET_DIR") -TARGET_DIR_BASENAME=$(basename "$TARGET_DIR") - -# 如果父目录是 '.', 则实际路径前缀为空,否则为 "父目录/" -# 这用于构建输出文件的完整路径,同时确保相对路径的简洁性 -if [ "$PARENT_OF_TARGET_DIR" = "." ]; then - OUTPUT_PATH_PREFIX="" -else - OUTPUT_PATH_PREFIX="${PARENT_OF_TARGET_DIR}/" - # 确保父目录存在,如果不存在则创建 - # mkdir -p 虽然不是最基础的 POSIX 标准,但在几乎所有现代系统中都可用 - mkdir -p "$PARENT_OF_TARGET_DIR" -fi - -OUTPUT_FILE="${OUTPUT_PATH_PREFIX}SUMMARY.md" - -# 确保目标目录存在 -if [ ! -d "$TARGET_DIR" ]; then - echo "错误: 目录 '$TARGET_DIR' 不存在。" - exit 1 -fi - -# 查找所有 YYYY-MM-DD.md 格式的文件路径,并按名称反向排序(最新日期在前) -# 使用 find 和 sort,这是非常标准和可移植的方法。 -# 将结果存储在一个换行符分隔的字符串变量中。 -files_paths=$(find "$TARGET_DIR" -maxdepth 1 -type f -name "????-??-??.md" | sort -r) - -# 检查是否找到了任何文件 -if [ -z "$files_paths" ]; then - echo "在目录 '$TARGET_DIR' 中没有找到 'YYYY-MM-DD.md' 格式的文件。" - echo "# Summary" > "$OUTPUT_FILE" - echo "" >> "$OUTPUT_FILE" - echo "" >> "$OUTPUT_FILE" - echo "$OUTPUT_FILE 已在 '$PARENT_OF_TARGET_DIR' (或当前目录) 中生成。" - exit 0 -fi - -# --- 复制最新文件到 TARGET_DIR 的父目录 --- -# 从已排序的列表中获取最新的文件(第一行) -latest_file_path=$(echo "$files_paths" | head -n 1) -latest_file_basename=$(basename "$latest_file_path") - -if [ -n "$latest_file_basename" ]; then - source_file_path="$latest_file_path" - destination_file_path="${OUTPUT_PATH_PREFIX}${latest_file_basename}" - - copy_needed="true" - # 检查源文件和目标文件是否是同一个。realpath 不是 POSIX 标准,但脚本会检查它是否存在。 - if command -v realpath >/dev/null 2>&1; then - abs_source_file_path=$(realpath "$source_file_path") - if [ -f "$destination_file_path" ]; then - abs_destination_file_path=$(realpath "$destination_file_path") - # 使用 POSIX 标准的 `=` 进行字符串比较 - if [ "$abs_source_file_path" = "$abs_destination_file_path" ]; then - echo "最新的文件 '${source_file_path}' 已在目标位置 '${destination_file_path}',无需复制。" - copy_needed="false" - fi - fi - else - echo "警告: 'realpath' 命令未找到。如果源文件和目标位置相同,可能会尝试重复复制。" - if [ "$source_file_path" = "$destination_file_path" ]; then - echo "最新的文件 '${source_file_path}' 已在目标位置 '${destination_file_path}' (基于路径比较),无需复制。" - copy_needed="false" - fi - fi - - if [ "$copy_needed" = "true" ]; then - echo "正在复制 '${source_file_path}' 到 '${destination_file_path}'..." - if cp "$source_file_path" "$destination_file_path"; then - echo "最新文件复制成功。" - else - echo "警告: 将最新文件复制到 '${destination_file_path}' 失败。请检查权限和路径。" - fi - fi -else - echo "未找到最新文件,无法执行复制操作。" -fi -# --- 复制结束 --- - - -# 开始写入 SUMMARY.md -echo "# Summary" > "$OUTPUT_FILE" - -# 写入 "Today" 链接 (指向复制到父目录的文件) -if [ -n "$latest_file_basename" ]; then - echo "" >> "$OUTPUT_FILE" - echo "[Today]($latest_file_basename)" >> "$OUTPUT_FILE" -else - echo "" >> "$OUTPUT_FILE" -fi - -current_month_header="" - -# 使用 while read 循环逐行处理文件路径列表,这是处理多行文本的标准 sh 做法 -echo "$files_paths" | while read -r file_path_from_list; do - # 在循环内为每一行获取文件名 - filename_basename=$(basename "$file_path_from_list") - - # 使用 cut 命令进行子字符串提取,以兼容 sh (${var:offset:length} 是 bash 专有语法) - year_month=$(echo "$filename_basename" | cut -c1-7) # "YYYY-MM" - month_day_part=$(echo "$filename_basename" | cut -c6-10) # "MM-DD" - - if [ "$year_month" != "$current_month_header" ]; then - echo "" >> "$OUTPUT_FILE" - echo "# $year_month" >> "$OUTPUT_FILE" - current_month_header="$year_month" - fi - - link_text="${month_day_part}-日刊" - # 链接路径是相对于 SUMMARY.md 的,指向原始目录中的文件 - link_path="${TARGET_DIR_BASENAME}/${filename_basename}" - - echo "- [$link_text]($link_path)" >> "$OUTPUT_FILE" -done - -echo "" # 在文件末尾添加一个空行 -echo "SUMMARY.md 文件已在 '${OUTPUT_FILE}' 生成。" -if [ "$PARENT_OF_TARGET_DIR" = "." ]; then - echo " (即当前工作目录的 SUMMARY.md)" -else - echo " (即目录 '${PARENT_OF_TARGET_DIR}' 下的 SUMMARY.md)" -fi \ No newline at end of file diff --git a/cron-docker/scripts/work/github.sh b/cron-docker/scripts/work/github.sh deleted file mode 100644 index 08f6b52..0000000 --- a/cron-docker/scripts/work/github.sh +++ /dev/null @@ -1,227 +0,0 @@ -#!/bin/sh - -# --- 配置 --- -# 从环境变量读取,或者直接在此处设置 -# 强烈建议使用环境变量以保证安全 -GITHUB_TOKEN=${GITHUB_TOKEN} # 替换 YOUR_GITHUB_PAT 或设置环境变量 -OWNER=${OWNER} # 你的 GitHub 用户名或组织名 -REPO=${REPO_NAME} # 你的仓库名称 -BRANCH="main" # 目标分支 (可能是 main, master 等) - -set -e # 如果任何命令失败,脚本将退出 -set -o pipefail # 如果管道中的任何命令失败,则整个管道失败 - -# API基础URL -API_URL="https://api.github.com/repos/${OWNER}/${REPO}/contents" - -# --- 帮助信息 --- -usage() { - echo "用法: $0 [options]" - echo "" - echo "Actions:" - echo " delete " - echo " 删除仓库中的指定文件。" - echo " Example: $0 delete 'path/to/remote/file.txt' 'Delete old file'" - echo "" - echo " upload " - echo " 上传/更新本地文件到仓库中的指定路径。" - echo " Example: $0 upload './local/new_file.txt' 'path/to/remote/new_file.txt' 'Add new feature file'" - echo "" - echo "请确保 GITHUB_TOKEN 环境变量已设置。" - exit 1 -} - -# --- 必要检查 --- -if [ -z "$GITHUB_TOKEN" ]; then - echo "错误: GITHUB_TOKEN 环境变量未设置。" - usage -fi - -if ! command -v curl &> /dev/null; then - echo "错误: curl 未安装。" - exit 1 -fi - -if ! command -v jq &> /dev/null; then - echo "错误: jq 未安装。" - exit 1 -fi - -if ! command -v mktemp &> /dev/null; then - echo "错误: mktemp 未安装。" - exit 1 -fi - - -# --- 辅助函数:获取文件SHA (如果文件存在) --- -get_file_sha() { - local file_path_in_repo="$1" - local response - response=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" \ - -H "Accept: application/vnd.github.v3+json" \ - "${API_URL}/${file_path_in_repo}?ref=${BRANCH}") - - if echo "$response" | jq -e '.sha' > /dev/null; then - echo "$response" | jq -r '.sha' - else - # 文件不存在或获取SHA失败 - echo "" - fi -} - -# --- 功能函数:删除文件 --- -delete_github_file() { - local file_path_in_repo="$1" - local commit_message="$2" - local tmp_payload_file # 声明临时文件变量 - - echo "正在尝试删除仓库中的文件: ${file_path_in_repo} ..." - - local file_sha - file_sha=$(get_file_sha "${file_path_in_repo}") - - if [ -z "$file_sha" ]; then - echo "错误: 文件 '${file_path_in_repo}' 在分支 '${BRANCH}' 上未找到,或无法获取其SHA。" - return 1 - fi - - echo "获取到文件SHA: ${file_sha}" - - # 创建临时文件来存储JSON payload - tmp_payload_file=$(mktemp) - # 确保脚本退出时删除临时文件 - trap 'rm -f "$tmp_payload_file"' EXIT HUP INT QUIT TERM - - printf '{"message": "%s", "sha": "%s", "branch": "%s"}' \ - "$commit_message" \ - "$file_sha" \ - "$BRANCH" > "$tmp_payload_file" - - echo "发送删除请求 (payload from: $tmp_payload_file)..." - response_code=$(curl -s -o /dev/null -w "%{http_code}" \ - -X DELETE \ - -H "Authorization: token ${GITHUB_TOKEN}" \ - -H "Accept: application/vnd.github.v3+json" \ - -H "Content-Type: application/json" \ - --data-binary @"$tmp_payload_file" \ - "${API_URL}/${file_path_in_repo}") - - # 清理临时文件和trap - rm -f "$tmp_payload_file" - trap - EXIT HUP INT QUIT TERM # 清除trap - - if [ "$response_code" -eq 200 ] || [ "$response_code" -eq 204 ]; then - echo "文件 '${file_path_in_repo}' 删除成功。HTTP状态: ${response_code}" - else - echo "错误: 删除文件 '${file_path_in_repo}' 失败。HTTP状态: ${response_code}" - # printf '{"message": "%s", "sha": "%s", "branch": "%s"}' "$commit_message" "$file_sha" "$BRANCH" > payload.json - # curl -i -X DELETE \ - # -H "Authorization: token ${GITHUB_TOKEN}" \ - # -H "Accept: application/vnd.github.v3+json" \ - # -H "Content-Type: application/json" \ - # --data-binary @payload.json \ - # "${API_URL}/${file_path_in_repo}" - # rm payload.json - return 1 - fi -} - -# --- 功能函数:上传/更新文件 --- -upload_github_file() { - local local_file_path="$1" - local file_path_in_repo="$2" - local commit_message="$3" - local tmp_payload_file # 声明临时文件变量 - - if [ ! -f "$local_file_path" ]; then - echo "错误: 本地文件 '${local_file_path}' 未找到。" - return 1 - fi - - echo "正在准备上传/更新文件: ${local_file_path} 到仓库路径: ${file_path_in_repo} ..." - - local content_base64 - if [[ "$(uname)" == "Darwin" ]]; then # macOS - content_base64=$(base64 < "$local_file_path") - else # Assume GNU/Linux - content_base64=$(base64 -w 0 < "$local_file_path") - fi - - local current_sha - current_sha=$(get_file_sha "${file_path_in_repo}") - - local json_payload_template='{"message": "%s", "content": "%s", "branch": "%s"%s}' - local sha_part="" - - if [ -n "$current_sha" ]; then - echo "文件 '${file_path_in_repo}' 已存在,SHA: ${current_sha}。将进行更新。" - sha_part=$(printf ', "sha": "%s"' "$current_sha") - else - echo "文件 '${file_path_in_repo}' 不存在。将创建新文件。" - fi - - # 创建临时文件来存储JSON payload - tmp_payload_file=$(mktemp) - # 确保脚本退出时删除临时文件 - trap 'rm -f "$tmp_payload_file"' EXIT HUP INT QUIT TERM - - printf "$json_payload_template" \ - "$commit_message" \ - "$content_base64" \ - "$BRANCH" \ - "$sha_part" > "$tmp_payload_file" - - echo "发送上传/更新请求 (payload from: $tmp_payload_file)..." - response_code=$(curl -s -o /dev/null -w "%{http_code}" \ - -X PUT \ - -H "Authorization: token ${GITHUB_TOKEN}" \ - -H "Accept: application/vnd.github.v3+json" \ - -H "Content-Type: application/json" \ - --data-binary @"$tmp_payload_file" \ - "${API_URL}/${file_path_in_repo}") - - # 清理临时文件和trap - rm -f "$tmp_payload_file" - trap - EXIT HUP INT QUIT TERM # 清除trap - - if [ "$response_code" -eq 200 ] || [ "$response_code" -eq 201 ]; then # 200 for update, 201 for create - echo "文件 '${file_path_in_repo}' 上传/更新成功。HTTP状态: ${response_code}" - else - echo "错误: 上传/更新文件 '${file_path_in_repo}' 失败。HTTP状态: ${response_code}" - # printf "$json_payload_template" "$commit_message" "$content_base64" "$BRANCH" "$sha_part" > payload.json - # curl -i -X PUT \ - # -H "Authorization: token ${GITHUB_TOKEN}" \ - # -H "Accept: application/vnd.github.v3+json" \ - # -H "Content-Type: application/json" \ - # --data-binary @payload.json \ - # "${API_URL}/${file_path_in_repo}" - # rm payload.json - return 1 - fi -} - -# --- 主逻辑 --- -ACTION="${1:-}" - -case "$ACTION" in - delete) - if [ "$#" -ne 3 ]; then - echo "错误: delete 操作需要 参数。" - usage - fi - delete_github_file "$2" "$3" - ;; - upload) - if [ "$#" -ne 4 ]; then - echo "错误: upload 操作需要 , 参数。" - usage - fi - upload_github_file "$2" "$3" "$4" - ;; - *) - echo "错误: 未知操作或缺少操作参数。" - usage - ;; -esac - -exit 0 \ No newline at end of file diff --git a/cron-docker/scripts/work/replace.sh b/cron-docker/scripts/work/replace.sh deleted file mode 100644 index 796b9b7..0000000 --- a/cron-docker/scripts/work/replace.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/sh - -# 检查是否提供了目录参数 -if [ -z "$1" ]; then - echo "用法: $0 <目标目录>" - echo "例如: $0 /path/to/your/directory" - exit 1 -fi - -IMG_PROXY_URL=${IMG_PROXY_URL} -TARGET_DIR="$1" - -# 检查目录是否存在 -if [ ! -d "$TARGET_DIR" ]; then - echo "错误: 目录 '$TARGET_DIR' 不存在。" - exit 1 -fi - -echo "将在目录 '$TARGET_DIR' 下的文件中执行以下替换:" -echo "1. 'upload.chinaz.com' -> 'pic.chinaz.com'" -echo "2. 'https://pic.chinaz.com' -> '$IMG_PROXY_URL/?pp=https://pic.chinaz.com'" - -# 定义替换规则 -# 注意: -# - 第一个替换中的 '.' 需要转义,因为它在正则表达式中是特殊字符。 -# - 第二个替换中的 '/' 在sed的s命令中是分隔符,所以我们需要使用其他分隔符, -# 例如 '#',或者对规则中的 '/' 进行转义。使用其他分隔符更清晰。 -# - 替换的顺序很重要。先将 upload.chinaz.com 替换为 pic.chinaz.com, -# 这样新生成的 pic.chinaz.com 才能被第二条规则匹配并加上代理。 - -RULE1_OLD="upload\.chinaz\.com" # 转义 '.' -RULE1_NEW="pic.chinaz.com" - -RULE2_OLD_SED_SAFE="https://pic\.chinaz\.com" # 使用 '#' 作为分隔符,所以不需要转义 '/',但 '.' 仍需转义 -RULE2_NEW_SED_SAFE="$IMG_PROXY_URL/?pp=https://pic.chinaz.com" # URL中的'?'在替换部分不需要特殊处理 - -# 查找目录下的所有普通文件(排除目录和符号链接等)并执行替换 -# 使用 -print0 和 xargs -0 来安全处理包含空格或特殊字符的文件名 -# 或者使用 find ... -exec sed ... {} + -# 这里为了清晰,使用 find 和 while read 循环,同样能安全处理特殊文件名 - -find "$TARGET_DIR" -type f -print0 | while IFS= read -r -d $'\0' file; do - echo "正在处理文件: $file" - - # 执行第一个替换 - sed -i "s/$RULE1_OLD/$RULE1_NEW/g" "$file" - - # 执行第二个替换 (使用 # 作为分隔符) - sed -i "s#$RULE2_OLD_SED_SAFE#$RULE2_NEW_SED_SAFE#g" "$file" - - # 如果想在一个sed命令中完成,可以这样: - # sed -i -e "s/$RULE1_OLD/$RULE1_NEW/g" -e "s#$RULE2_OLD_SED_SAFE#$RULE2_NEW_SED_SAFE#g" "$file" - # 这样可以减少文件的读写次数,对于大文件或大量文件效率稍高。 - # 为了代码可读性,分开写了。 - -done - -echo "替换完成。" \ No newline at end of file diff --git a/daily/2025-06-01.md b/daily/2025-06-01.md new file mode 100644 index 0000000..487baf2 --- /dev/null +++ b/daily/2025-06-01.md @@ -0,0 +1,16 @@ +# AI洞察日报 2025年6月1日 + +1. 近日,**通义实验室**自然语言智能团队**发布并开源**了**VRAG-RL**——一款**视觉感知多模态RAG推理框架**,旨在解决**AI**从图像、表格等**视觉语言**中检索关键信息并进行**精细化推理**的难题,其强化学习和创新的视觉感知机制显著提升了对视觉信息的理解和检索效率。该框架在多个基准数据集上**表现出色**,未来有望提升模型在不同视觉任务中的**泛化能力**,请查阅[跳转链接](https://github.com/Alibaba-NLP/VRAG)了解更多。 +2. 亚利桑那州立大学研究小组**发布论文**指出,**大语言模型**并非进行**真正推理**,而仅仅是在**寻找数据间的相关性**,这可能导致公众对其工作机制产生**误解**。该研究强调,在日益依赖**AI**的时代,我们需更**谨慎看待**技术能力,未来**AI研究**有望朝着更具**解释性**的方向发展。 +3. **Perplexity AI**正式**推出Perplexity Labs**,为Pro订阅用户带来**多工具协同**的全新**AI生产力工具**,能将复杂项目开发流程简化至数分钟,旨在提供从创意到成果的**全链条支持**。这一功能通过深度网络浏览、代码执行等**核心能力**,标志着Perplexity从答案引擎向**综合性AI生产平台转型**。 +4. **夸克**近日**上线“深度研究”功能**,该功能依托**通义千问大模型**,能围绕学术课题、行业分析等复杂议题,自动完成从资料搜集到**报告生成**的全流程研究。此举标志着**AI**正从**信息检索工具**向**内容创作伙伴**进一步跃迁,为科研调研、市场洞察等场景提供**高效支持**。 +5. **阿里云**正式**发布通义灵码 AI IDE**,这是一款原生的人工智能开发环境,凭借强大的**编程智能体模式**、**长期记忆**和**行间建议预测**功能,显著提升开发者**编程效率**。该产品已**免费开放下载**,并且其插件累计生成超30亿行代码,成为广受欢迎的编程辅助工具,为企业开发工作提供**强力支持**。 +6. **Memvid**是一款**创新AI记忆工具**,通过将**文本数据编码为MP4视频**,实现了**亚秒级快速语义搜索**,大幅节省存储空间并支持离线使用。它内置**聊天功能**,支持**PDF文档导入**,为**高效知识管理**和**学术研究**等领域提供了革命性的**全新可能**,请查阅[跳转链接](https://github.com/Olow304/memvid)了解更多。 +7. Anthropic首席执行官达里奥・阿莫代伊**警告**称,**AI**可能在未来五年内**取代一半入门级白领工作**,导致**失业率飙升**至10%-20%,并加剧**经济不平等**。他呼吁提高公众对**AI**发展的**认知**和**AI素养**,以便人们适应未来职业环境,并强调政策制定者需思考超智能经济下的**解决方案**。 +8. AI初创公司**Manus**重磅**发布Manus Slides**功能,用户仅需一个提示词即可**一键生成专业幻灯片**,涵盖商务会议、教育课程等多种场景,大幅**提升演示文稿创作效率**。该功能凭借**智能生成**和**灵活编辑**能力,支持导出PowerPoint或PDF,标志着**AI代理**正从任务自动化向**生产力工具**进一步演进。 +9. 在GitHub上拥有**7086颗星**的**prompt-eng-interactive-tutorial**,是Anthropic公司**交互式提示工程教程**的开源项目,旨在帮助用户**有趣且有效地学习提示工程**,具体请访问[跳转链接](https://github.com/anthropics/prompt-eng-interactive-tutorial)。 +10. 获得**10143颗星**的**onlook**项目,是一个**开源可视化氛围编码编辑器**,它利用**AI**帮助设计师或开发者**可视化构建**、**美化和编辑React应用**。这款工具就像是设计师的**光标**,让**React开发**变得更**直观高效**,具体请访问[跳转链接](https://github.com/onlook-dev/onlook)。 +11. 拥有**12755颗星**的**anthropic-cookbook**项目,是Anthropic公司**展示如何有趣且有效地使用Claude**的**笔记本/秘籍集合**。它为用户提供了多样化的**Claude使用方法**,是**学习和应用Claude**的便捷[跳转链接](https://github.com/anthropics/anthropic-cookbook)。 +12. **MMSI-Bench**是一个针对**多图像空间智能**的**VQA基准测试**,研究发现,尽管多模态大语言模型(MLLMs)已取得进展,但在**多图像空间推理**方面,其准确率(30-40%)与人类(97%)之间存在**巨大差距**。该研究诊断了模型四种主要的**失败模式**,为未来提升**多图像空间智能**提供了**宝贵见解**,论文详情请见[跳转链接](https://arxiv.org/abs/2505.23764)。 +13. **ZeroGUI**是一个创新的**在线学习框架**,它以**零人力成本自动化GUI智能体训练**,通过基于VLM的自动任务生成和奖励评估,克服了传统GUI学习对人工标注的**重度依赖**。实验证明,该框架显著提升了**GUI智能体**在不同环境下的**性能**,为**自动化GUI操作**带来了**高效解决方案**,论文详情请见[跳转链接](https://arxiv.org/abs/2505.23762)。 +14. **ATLAS**是一个针对**Transformer**架构设计的高容量**长期记忆模块**,它通过优化**记忆上下文**来克服现有模型在**长序列理解**上的局限,从而在测试时学习最优的记忆策略。实验结果表明,**ATLAS**在语言建模和长上下文理解等任务中表现优于Transformer和线性循环模型,显著**提升了性能**,论文详情请见[跳转链接](https://arxiv.org/abs/2505.23735)。 diff --git a/daily/2025-06-02.md b/daily/2025-06-02.md new file mode 100644 index 0000000..f4f8da5 --- /dev/null +++ b/daily/2025-06-02.md @@ -0,0 +1,30 @@ +# AI洞察日报 2025年6月2日 + +**AI产品与功能更新** + +1. Runway公司最新推出的**Gen-4References**功能已支持移动设备,使用户能通过手机照片结合自然语言提示,快速生成风格一致的艺术作品。这项功能将**AI生成技术**与移动便捷性完美结合,大幅降低了**AI创作**门槛,为内容创作者和普通用户带来了无限可能。 +
[![图片](https://upload.chinaz.com/2025/0530/6388420978332595536873671.png "img")](https://upload.chinaz.com/2025/0530/6388420978332595536873671.png)
+2. Anthropic近期宣布,其旗舰模型**Claude**已新增功能,支持开发者构建能与Claude直接对话的**AI应用程序**,这与**AI Studio**的开发理念高度契合。此举不仅降低了**AI应用开发**门槛,为开发者提供了更广阔的创新空间,也预示着AI应用普及与落地将进一步加速。 +
[![图片](https://pic.chinaz.com/picmap/202403050858462025_0.jpg "img")](https://pic.chinaz.com/picmap/202403050858462025_0.jpg)
+ +**AI前沿研究** + +1. 华为近期通过其"昇腾 + Pangu Ultra MoE”系统展示了一项惊人突破:一个近万亿参数的MoE大模型,在不使用GPU的情况下,仅需2秒便能解答一道高等数学题。这不仅彰显了华为在自主可控国产算力与模型训练方面的强大实力,也为未来大规模AI模型的训练与应用开辟了新可能。 +
[![图片](https://upload.chinaz.com/2025/0530/6388421664760221719225455.png "img")](https://upload.chinaz.com/2025/0530/6388421664760221719225455.png)
+2. 这篇论文通过构建一个英语回文谜题基准测试,揭示了当前**视觉-语言模型**(**VLM**)在理解和解决这类谜题时遇到的显著困难。尽管VLM在解码简单视觉线索方面表现出一定能力,但对于需要**抽象推理**、**横向思维**及理解**视觉隐喻**的任务,它们仍旧力不从心,表明多模态抽象是其面临的独特挑战。详情请见:[Link](https://arxiv.org/abs/2505.23759)。 +3. **LoRAShop**是一个创新的**多概念图像编辑框架**,它利用**修正流Transformer**的特性,实现了在不重新训练模型的情况下,将多个主题或风格无缝融入原始场景。这项技术通过智能融合LoRA权重,不仅保留了图像的整体背景和细节,还在身份保持上超越了现有基线,为个性化**图像生成**和**编辑**带来了革命性的"Photoshop式”体验。详情请见:[Link](https://arxiv.org/abs/2505.23758)。 +4. **DeepTheorem**是一个利用**自然语言**和**强化学习**(**RL-Zero**)来增强**大型语言模型**(**LLM**)数学推理能力的非正式**定理证明框架**。该框架通过一个大规模高质量数据集和创新策略,显著提升了LLM在IMO级别非正式定理证明中的表现,展现了其在数学探索和自动化证明领域的巨大潜力。详情请见:[Link](https://arxiv.org/abs/2505.23754)。 + +**AI行业展望与社会影响** + +1. 根据阿姆斯特丹自由大学环境研究所博士生Alex de Vries-Gao的分析,人工智能的电力消耗预计将在2025年底前接近全球数据中心总电力消耗的一半,这意味着其能耗将很快超越比特币挖矿。尽管技术效率有所提升,但AI的电力需求仍在快速增长,凸显了在能耗与可持续发展之间寻找平衡的重要性。 +
[![图片](https://pic.chinaz.com/picmap/202005281122057197_51.jpg "img")](https://pic.chinaz.com/picmap/202005281122057197_51.jpg)
+2. 近期,黑客通过伪装成**阿里云AI SDK**的恶意软件包,成功实施了供应链攻击,利用隐藏在**Pickle**格式ML模型中的**恶意代码**窃取用户敏感信息。这揭示了**AI安全供应链**面临的新挑战,传统安全工具在检测恶意ML模型方面的不足,以及开发者面临的潜在风险。 +
[![图片](https://pic.chinaz.com/picmap/202306161513254632_1.jpg "img")](https://pic.chinaz.com/picmap/202306161513254632_1.jpg)
+ +**开源TOP项目** + +1. **courses**是一个由Anthropic提供的**教育课程**项目,旨在帮助用户学习相关知识。该项目在GitHub上拥有**13483**颗星,可访问其GitHub页面:[Link](https://github.com/anthropics/courses)。 +2. **agent-zero**是一个提供**AI框架**功能的项目,旨在帮助开发者构建AI应用。该项目在GitHub上获得了**7360**颗星,详情可前往:[Link](https://github.com/frdel/agent-zero)。 +3. **cobalt**是一个致力于"**保存你所喜爱事物的最佳方式**”的项目,为用户提供高效的收藏管理功能。该项目在GitHub上备受欢迎,拥有**32941**颗星,可通过[Link](https://github.com/imputnet/cobalt)查看详情。 +4. **the-book-of-secret-knowledge**是一个内容丰富的**知识集合**项目,汇集了鼓舞人心的列表、手册、备忘单及各类工具。该项目在GitHub上拥有高达**171992**颗星,是寻求实用信息和技巧的宝库,访问地址为:[Link](https://github.com/trimstray/the-book-of-secret-knowledge)。 \ No newline at end of file diff --git a/daily/2025-06-03.md b/daily/2025-06-03.md new file mode 100644 index 0000000..16e0253 --- /dev/null +++ b/daily/2025-06-03.md @@ -0,0 +1,19 @@ +# AI洞察日报 2025年6月3日 + +**AI产品与功能更新** +1. 谷歌近日在美国地区推出了 **Gemini Live** 功能,正式登陆 **iOS** 和 **iPadOS** 平台,用户可通过 **Gemini App** 免费体验 **AI** 识别场景和屏幕内容的便捷。这项创新不仅提升了用户互动体验,也预示着 **AI** 技术正进一步融入日常生活,成为人们的智能助手。
[![图片](https://upload.chinaz.com/2025/0603/6388453725280965957304782.png "img")](https://upload.chinaz.com/2025/0603/6388453725280965957304782.png)
+2. 微软最新推出了免费的 **Bing Video Creator** 工具,基于 **OpenAI Sora** 技术,让用户通过简单的文字提示即可轻松创作短视频。这款工具已在全球范围内的必应移动应用中上线,极大降低了视频创作的门槛,有望丰富用户的创作体验。
[![图片](https://upload.chinaz.com/2025/0603/6388453719041406883771175.png "img")](https://upload.chinaz.com/2025/0603/6388453719041406883771175.png)
+3. 新加坡国立大学(NUS)团队近日发布了 **OmniConsistency** 项目,它以极低成本复现了 **GPT-4o** 在图像风格化上的一致性,解决了开源社区的风格化难题。该项目通过独特的学习框架和模块化架构,有望成为图像生成领域的重要工具,推动 **AI** 艺术创作。
[![图片](https://upload.chinaz.com/2025/0603/6388453880310640421505355.png "img")](https://upload.chinaz.com/2025/0603/6388453880310640421505355.png)
+ +**AI前沿研究** +1. **WebChoreArena** ([Link](https://arxiv.org/abs/2506.01952)) 提出了一个包含 532 项精心策划任务的全新基准,旨在评估 **LLM** 驱动的网页浏览代理处理繁琐复杂网页任务的能力。研究发现,尽管 **GPT-4o** 等先进大模型在此基准上表现出显著进步,但相较于通用网页任务,仍有巨大的提升空间,凸显了处理复杂**"网络杂务”**的挑战性。 +2. **RoboMaster** ([Link](https://arxiv.org/abs/2506.01943)) 提出了一种创新的机器人操作视频生成框架,它通过协作轨迹建模和阶段性分解交互过程,有效解决了多目标交互中视觉保真度下降的问题。这项技术成功地实现了**机器人操作**中视频生成质量的新突破,为复杂场景下的**轨迹控制**提供了更精准的解决方案。 + +**AI行业展望与社会影响** +1. 近日,美国犹他州律师理查德・贝德纳因在法庭文件中引用 **ChatGPT** 生成的虚假案例,被法院处以罚款,再次引发了对 **AI** 在法律领域应用的广泛争议。此事件深刻提醒法律从业者,在使用新兴技术时,务必保持严谨的**审核责任**,确保法律文件的准确性。
[![图片](https://pic.chinaz.com/picmap/202304121052180076_0.jpg "img")](https://pic.chinaz.com/picmap/202304121052180076_0.jpg)
+2. **OpenAI** 计划在2025年上半年将 **ChatGPT** 打造为具备 **T 型技能** 的"**超级助手**”,旨在挑战苹果 **Siri** 的市场地位。这份战略文件透露,**OpenAI** 不仅希望 **ChatGPT** 成为能处理日常琐事和复杂任务的智能伙伴,更呼吁用户能在所有平台上自由选择默认 **AI** 助手,推动 **AI** 市场更加开放。 + +**开源TOP项目** +1. **nautilus_trader** ([Link](https://github.com/nautechsystems/nautilus_trader)) 是一个拥有 6728 **Star** 的**高性能算法交易平台**和**事件驱动回测器**,为开发者提供强大的交易策略验证能力。 +2. **data-engineer-handbook** ([Link](https://github.com/DataExpert-io/data-engineer-handbook)) 拥有 28669 **Star**,是一个旨在帮助用户学习**数据工程**的综合性资源仓库,汇集了所有相关学习链接。 +3. **postiz-app** ([Link](https://github.com/gitroomhq/postiz-app)) 是一个坐拥 20460 **Star** 的**终极社交媒体日程安排工具**,集成了大量 **AI** 功能,旨在简化社交媒体管理。 \ No newline at end of file diff --git a/daily/2025-06-04.md b/daily/2025-06-04.md new file mode 100644 index 0000000..49d147f --- /dev/null +++ b/daily/2025-06-04.md @@ -0,0 +1,36 @@ +# AI洞察日报 2025年6月4日 + +**AI产品与功能更新** + +1. Komiko平台近日推出**视频到视频**功能,利用AI技术将用户上传的视频一键转换为**动漫**、漫画等多样化艺术风格的动态内容,极大降低了动画创作的门槛。该功能通过深度整合先进AI模型,并提供AI线稿上色、动画补帧等工具,旨在加速创意产业的数字化转型,成为专业人士和爱好者的**首选**创作工具。 +
[![图片](https://upload.chinaz.com/2025/0604/6388464889049235843422625.png "img")](https://upload.chinaz.com/2025/0604/6388464889049235843422625.png)
+2. 蚂蚁集团的**"AI健康管家”**成功通过信通院医疗健康行业大模型**可信评估**,成为首批获认可的产品之一,进一步提升了其在医疗AI领域的**可靠性**。该产品已服务超**4000万用户**,提供预约医生、健康评估、报告解读等**智能健康服务**,并吸引了60多位知名医生AI智能体入驻,未来将持续扩展功能。 +
[![图片](https://pic.chinaz.com/picmap/202309121506505395_0.jpg "img")](https://pic.chinaz.com/picmap/202309121506505395_0.jpg)
+ +**AI前沿研究** + +1. AI"教父”**约书亚・本吉奥**成立非营利组织**LawZero**,投入3000万美元启动资金,旨在开发**"科学家 AI”**系统以防范未来AI智能体对人类进行欺骗。该系统将作为AI安全监控的**护栏**,确保自身智能程度与所监管AI智能体相当,通过提高AI的**透明性和可信性**,推动行业向更负责任的方向发展。 +
[![图片](https://pic.chinaz.com/picmap/202412271635326771_0.jpg "img")](https://pic.chinaz.com/picmap/202412271635326771_0.jpg)
+2. Play AI开源发布了**PlayDiffusion**,一款基于扩散模型的语音**"局部修改”**工具,能够实现对音频片段的替换、删除或调整而**不留痕迹**,极大提升了音频编辑效率和自然度。该技术能以高达50倍的速度提升**TTS推理效率**,并保持全局一致性,对播客制作、AI配音和内容纠错等场景具有**重要意义**,有望成为内容创作的必备利器。 + GitHub: [PlayDiffusion](https://github.com/playht/PlayDiffusion) 模型下载: [PlayDiffusion](https://huggingface.co/PlayHT/PlayDiffusion) +3. LumosFlow是一个用于**长视频生成**的新框架,它通过引入**运动引导**来解决现有方法中时间连贯性不足和过渡不自然的问题。该研究通过分层生成关键帧并分解中间帧插值,实现了高达**15倍的插值**,确保了生成视频的**运动和外观一致性**。 + 论文URL: [LumosFlow](https://arxiv.org/abs/2506.02497) + +**AI行业展望与社会影响** + +1. OpenAI以30亿美元收购**Windsurf**后,用户对其**Claude模型访问权限**大幅受限,引发开发者普遍不满,严重影响了开发效率与用户体验。此举导致Windsurf用户面临**成本增加**和操作复杂性,且未能获得Claude4系列直接访问,这可能威胁Windsurf在激烈市场竞争中的**未来增长**。 +
[![图片](https://pic.chinaz.com/picmap/202502061719371797_2.jpg "img")](https://pic.chinaz.com/picmap/202502061719371797_2.jpg)
+ +**开源TOP项目** + +1. **RedditVideoMakerBot** (⭐7672) 是一个开源项目,旨在通过**一条命令**简化Reddit视频的创建过程,极大地降低了用户制作视频的门槛。 + 项目URL: [RedditVideoMakerBot](https://github.com/elebumm/RedditVideoMakerBot) +2. **cursor-free-vip** (⭐28687) 是一款专为**Cursor AI**设计的工具,能够自动重置机器ID,从而**免费升级**并绕过其Pro功能中的**高代币限制**和试用请求限制。该项目有效解决了用户在Cursor AI使用过程中遇到的**免费试用账户限制**问题。 + 项目URL: [cursor-free-vip](https://github.com/yeongpin/cursor-free-vip) + +**科技博主观点** + +1. 科技博主**大帅老猿**指出,通过**重新讲述**学到的知识并录制视频来卖课是常见操作,但**标榜原创**的行为只可能欺骗新手。他强调检验原创的**唯一真理**是**举报**、投诉、打官司,只有能让侵权内容下架或获得赔偿,才有资格自称原创。 + [Tweet Link](https://x.com/ezshine/status/1930068772146295153) +2. 博主**ginobefun**推荐了一篇关于**复杂RAG架构演进**的InfoQ文章,该文章深入探讨了**跨模态知识联邦**与**统一语义推理**的实践。文章提出通过**融合知识库**和**统一知识图谱**解决传统RAG在处理异构、多模态知识时的挑战,并通过医疗和金融案例展示了其**应用价值**。 +
[![图片](https://pbs.twimg.com/media/Gsj5vqPa0AAPVEa?format=jpg&name=orig "img")](https://pbs.twimg.com/media/Gsj5vqPa0AAPVEa?format=jpg&name=orig)

[![图片](https://pbs.twimg.com/media/Gsj52bAasAIfgTI?format=jpg&name=orig "img")](https://pbs.twimg.com/media/Gsj52bAasAIfgTI?format=jpg&name=orig)

[![图片](https://pbs.twimg.com/media/Gsj54ksasAADTeL?format=jpg&name=orig "img")](https://pbs.twimg.com/media/Gsj54ksasAADTeL?format=jpg&name=orig)
文章链接:[文章](https://bestblogs.dev/article/2ba211) diff --git a/daily/2025-06-05.md b/daily/2025-06-05.md new file mode 100644 index 0000000..e21c312 --- /dev/null +++ b/daily/2025-06-05.md @@ -0,0 +1,23 @@ +# AI洞察日报 2025/6/5 + +**AI产品与功能更新** +1. Suno 近日升级了其**AI音乐编辑工具**,允许用户上传和混音未完成的作品,并能修改歌词和延长曲目时长至八分钟,同时引入了创意滑块等功能。
[![图片](https://pic.chinaz.com/picmap/202406061628284261_1.jpg "img")](https://pic.chinaz.com/picmap/202406061628284261_1.jpg)
此次升级正值其面临主要唱片公司的版权诉讼,唱片公司希望引入类似于 **YouTube Content ID** 的技术来追踪 **AI** 平台上的音乐使用情况。 +2. OpenAI 近日宣布 **ChatGPT** 升级新功能,现可连接 **Outlook**、**Teams**、**Gmail** 等多个外部服务,旨在提升企业用户的协作和信息获取效率。
[![图片](https://pic.chinaz.com/picmap/202412271704353969_1.jpg "img")](https://pic.chinaz.com/picmap/202412271704353969_1.jpg)
此外,**macOS** 版 **ChatGPT Team** 用户还新增了"**录制模式**”,能自动生成会议记录和待办事项。 +3. AI驱动的代码编辑器 **Cursor** 于近日正式发布1.0版本,引入了核心功能 **BugBot**,能自动化审查 **GitHub** 上的 **Pull Request** 并一键修复代码。
[![图片](https://upload.chinaz.com/2025/0605/6388471022950404092684122.png "img")](https://upload.chinaz.com/2025/0605/6388471022950404092684122.png)
该版本还全面开放了后台代理功能,并增加了 **Jupyter** 支持和"Memories”项目管理功能,旨在显著提升开发者的生产力。 +4. 腾讯公益近日推出了创新性的"**问 AI**”功能,首次将**大型人工智能模型**应用于公益领域,旨在提升公众与公益项目及机构之间的互动和透明度。
[![图片](https://pic.chinaz.com/picmap/201811151633427149_4.jpg "img")](https://pic.chinaz.com/picmap/201811151633427149_4.jpg)
这一便捷的沟通方式有助于公众更深入地理解并参与公益事业,并有望推动公益事业的进一步发展。 + +**AI前沿研究** +1. 这项研究提出 **SuperWriter-Agent** 框架,通过引入结构化的思考、规划和完善阶段,显著提升了**大型语言模型**在生成长文本时的连贯性和质量。
基于此框架训练的 **SuperWriter-LM** 在多项基准测试中表现出领先水平,证明了这种反思驱动方法能够让模型像专业作家一样,生成更高质量和一致性的长篇内容:[Link](https://arxiv.org/abs/2506.04180)。 + +**AI行业展望与社会影响** +1. OpenAI 首席执行官 **山姆・奥尔特曼** 指出,**AI** 正逐渐被企业视为基层员工,导致科技公司初级职位招聘量在2023至2024年间下降了25%。
[![图片](https://pic.chinaz.com/picmap/202305291455510902_2.jpg "img")](https://pic.chinaz.com/picmap/202305291455510902_2.jpg)
专家预测,到2030年 **AI** 可能取代多达3.75亿个工作岗位,甚至未来1到5年内可能淘汰一半的初级白领岗位,引发高达20%的失业率。 + +**开源TOP项目** +1. **HowToCook** 是一个专为程序员设计的居家烹饪方法指南,旨在解决程序员做饭难的问题。该项目目前已获得 **87530** 个 **Star**,内容仅限简体中文,提供详细的烹饪指导:[Link](https://github.com/Anduin2017/HowToCook)。 +2. **system-design-primer** 是一项旨在帮助学习如何设计大规模系统并准备系统设计面试的开源项目,已获得 **304096** 个 **Star**。它提供了全面的学习资源,并包含 **Anki** 抽认卡辅助学习:[Link](https://github.com/donnemartin/system-design-primer)。 +3. **ChinaTextbook** 项目致力于收集中国所有小学、初中、高中及大学的 **PDF教材**,为学生和教师提供免费的教育资源。这个实用的资料库已获得 **35875** 个 **Star**:[Link](https://github.com/TapXWorld/ChinaTextbook)。 +4. Firecrawl 近日发布了突破性的 **/search API**,允许开发者通过一次API调用实现网页搜索与内容抓取,并以 **AI友好** 的多种格式输出数据。
[![图片](https://upload.chinaz.com/2025/0605/6388471694605610854897111.png "img")](https://upload.chinaz.com/2025/0605/6388471694605610854897111.png)
这一功能极大简化了 **AI** 应用的数据获取流程,无需第三方依赖,提升了数据处理效率,并在 **GitHub** 上已获得超过10K的 **Star**。 + +**社媒分享** +1. **Gorden Sun** 分享了一套能生成"超级赞”图文效果的 **AI** 提示词,并推荐使用 **GPT4o**、**Claude-3.7** 和 **DeepSeek-V3** 等工具。
[![Image](https://pbs.twimg.com/media/Gse1INSb0AQCh0S?format=jpg&name=orig "img")](https://pbs.twimg.com/media/Gse1INSb0AQCh0S?format=jpg&name=orig)
他指出,这些提示词虽然易于使用,但原作者在整理上花费了心思:[Link](https://x.com/Gorden_Sun/status/1930466986544308552)。 +2. 推主 **wwwyesterday** 将现代学术论文比作 **npm** 包管理系统,认为两者都存在论文/包数量庞大、引用/依赖层层叠叠的现象,且大部分价值不高,少数经典广为引用。
他指出,现在很少有人能完全从零开始原创,就像写东西离不开 `package.json`,但他仍会刷 **arxiv** 寻找新观点:[Link](https://x.com/wwwgoubuli/status/1930310020312510934)。 diff --git a/daily/2025-06-06.md b/daily/2025-06-06.md new file mode 100644 index 0000000..3e2aaae --- /dev/null +++ b/daily/2025-06-06.md @@ -0,0 +1,29 @@ +# AI洞察日报 2025/6/6 + +**AI产品与功能更新** +1. **Pollo AI** 推出了一站式**AI图像与视频生成平台**,整合全球前沿模型如Google Veo 3、Kling等,提供文字转视频、图像风格化、角色一致性等多种功能,并支持API接入,相比同类平台更具成本和模型优势,且获得Google Cloud的Veo 3模型授权。 +
[![图片](https://assets-v2.circle.so/5fit6knlg31jzz4ds9stmn0z1wda "img")](https://assets-v2.circle.so/5fit6knlg31jzz4ds9stmn0z1wda)
+2. **Luma Labs** 发布了全新的**AI视频编辑工具** Modify Video,基于其Dream Machine平台和**Ray2模型**,用户能通过文本提示对视频进行风格重塑、场景替换和角色调整,大幅降低了传统视频制作的复杂性和成本。该工具凭借Ray2模型的强大能力,在动作流畅性和时间一致性方面表现出色,并降低了创意门槛。 +
[![图片](https://upload.chinaz.com/2025/0605/6388474336287139806268530.png "img")](https://upload.chinaz.com/2025/0605/6388474336287139806268530.png)
+3. 谷歌更新了**Gemini 2.5版本**,显著提升了**AI音频对话与生成技术**,使其成为一个能够原生理解和生成文本、图像、音频、视频和代码的多模态AI系统。新功能使得人机交流更加自然流畅,支持实时音频对话、风格控制和多语言,并通过可控的文本转语音技术,允许用户精确调整语音输出的语调和情感。 +
[![图片](https://upload.chinaz.com/2025/0605/6388474192800462061689108.png "img")](https://upload.chinaz.com/2025/0605/6388474192800462061689108.png)
+4. 热门手游《**逆水寒**》与**可灵AI**合作,在游戏内推出了全新的"**图生动图**”玩法,让玩家能够通过简单操作将静态图片转化为个性化动态画面。该功能支持用户截图或上传图片,通过输入描述词来生成动图,并可进行双人互动创作,提升了玩家的游戏体验。 +
[![图片](https://upload.chinaz.com/2025/0605/6388473368297009187838113.png "img")](https://upload.chinaz.com/2025/0605/6388473368297009187838113.png)
+ +**AI前沿研究** +1. **NVIDIA** 发布了**Llama-3.1-Nemotron-Nano-VL-8B-V1**,这是一款基于Llama-3.1架构的**8B参数视觉语言模型**,支持图像、视频和文本输入,并能输出高质量文本及具备强大的图像推理能力。该模型在OCR和文档智能方面表现卓越,通过AWQ4bit量化技术可在单张RTX GPU上高效部署,并已在Hugging Face平台开源,为开发者提供了轻量高效的多模态AI解决方案。 +
[![图片](https://upload.chinaz.com/2025/0605/6388473110722451938945298.jpg "img")](https://upload.chinaz.com/2025/0605/6388473110722451938945298.jpg)
+2. Voyager 是一种新颖的**视频扩散框架**,它能从单张图片和用户定义的摄像机路径,生成**世界一致的3D点云序列**,特别适用于游戏和虚拟现实中可探索的3D场景。这项技术通过联合生成对齐的RGB和深度视频序列,实现了帧间固有的**3D一致性**,显著提升了视觉质量和几何精度。论文地址:[https://arxiv.org/abs/2506.04225](https://arxiv.org/abs/2506.04225) + +**AI行业展望与社会影响** +1. 硅谷投资人**Mary Meeker**的最新**AI报告**指出,全球AI竞争格局正经历深刻重塑,中国AI力量与**开源浪潮**正全面崛起,挑战OpenAI等头部公司的主导地位。报告强调,中国AI模型性能已逼近国际一线,并在制造业中展现出强大的产业融合能力,同时开源模型凭借低成本和高灵活性,市场份额迅速增长,预示着AI行业进入多极对抗新时代。 +
[![图片](https://pic.chinaz.com/picmap/202304171408567483_0.jpg "img")](https://pic.chinaz.com/picmap/202304171408567483_0.jpg)
+ +**开源TOP项目** +1. **netbird** 是一个拥有 **14029** 颗星的**开源项目**,它基于 **WireGuard®** 帮助用户将设备连接到安全的覆盖网络,并支持**SSO**、**MFA**和精细的访问控制,提供安全高效的网络连接。项目地址:[https://github.com/netbirdio/netbird](https://github.com/netbirdio/netbird) +2. **quarkdown** 是一个拥有 **3952** 颗星的**开源项目**,旨在为 **Markdown** 文本赋予"超能力”,将想法轻松转化为演示文稿、文章和书籍等多种形式。项目地址:[https://github.com/iamgio/quarkdown](https://github.com/iamgio/quarkdown) +3. **cognee** 是一个拥有 **2658** 颗星的**开源项目**,其核心功能是仅用 **5 行代码**即可实现 **AI 智能体的记忆**,极大简化了智能体开发中的复杂性。项目地址:[https://github.com/topoteretes/cognee](https://github.com/topoteretes/cognee) + +**社媒分享** +1. @wwwyesterday 分享了一个关于与 **AI 对话**的"生活小妙招”,即在开始时让AI每次回复都称呼"哥哥”,一旦AI停止这样称呼,就意味着可以新开对话窗口了。这个小技巧巧妙地利用了AI的"记忆”机制,为用户提供了判断对话是否需要重新开始的依据。 +2. **Gorden Sun** 宣布 **Fish Audio** 已开源其 **S1-mini语音模型**,作为表现良好的S1模型的精简版(0.5B参数)。S1-mini可供个人免费部署使用,但不可商用。在线体验及模型链接:[https://huggingface.co/spaces/fishaudio/openaudio-s1-mini](https://huggingface.co/spaces/fishaudio/openaudio-s1-mini) [https://huggingface.co/fishaudio/openaudio-s1-mini](https://huggingface.co/fishaudio/openaudio-s1-mini)。 \ No newline at end of file diff --git a/daily/2025-06-07.md b/daily/2025-06-07.md new file mode 100644 index 0000000..056482c --- /dev/null +++ b/daily/2025-06-07.md @@ -0,0 +1,29 @@ +# AI洞察日报 2025/6/7 + +**AI产品与功能更新** + +1. 近日,德国科技巨头**博世**与**阿里云**合作,将**通义大模型**应用于**智能座舱**,通过云计算与端侧混合计算实现与**3D 数字人**的交互,提升座舱智能感知和多模态控制能力。该方案支持知识问答和同声传译,使智能座舱成为理解并满足用户需求的智能助手,标志着汽车行业正迈向个性化、智能化的移动空间。 +2. **Perplexity AI**近日推出**SEC**文件访问功能,旨在帮助各类投资者在**Perplexity 平台**轻松查询和理解复杂的**财务文档**,所有答案均附有引用。此外,**Perplexity**还推出了"**实验室**”功能,该功能能够将用户的提示转化为报告、仪表板等完整项目,显著提升了工作流效率。 +3. **Trae 平台**近日更新,正式集成**Google**的**Gemini 2.5 Pro Preview**模型,该模型在**WebDev Arena**和**LMArena 编码排行榜**中均位列第一,显著提升了前端开发与**UI 设计**能力。
[![图片](https://upload.chinaz.com/2025/0606/6388481749990229697161576.png "img")](https://upload.chinaz.com/2025/0606/6388481749990229697161576.png)
此次升级优化了代码转换、编辑及复杂代理工作流,并已免费向用户开放,有望推动**AI**在**区块链**和**去中心化应用**领域的创新。 +4. 海外知名的**AI 视频生成平台 PixVerse**正式推出其国内版"**拍我AI**”,同步上线移动端 App 和网页版,旨在为国内内容创作者和企业提供高效便捷的**AI 视频生成工具**。
[![图片](https://upload.chinaz.com/2025/0606/6388481574736715558459901.png "img")](https://upload.chinaz.com/2025/0606/6388481574736715558459901.png)
"**拍我AI**”支持通过文本或图像一键生成高质量、多风格视频,依托 PixVerse V4.5 算法并进行了本地化优化,有望推动中国市场**AI 视频技术**的普及和应用。 +5. **ElevenLabs**于2025年6月5日发布了被誉为"地表最强”的**文本转语音(TTS)模型**,**Eleven v3 (Alpha 版)**,该模型不仅能将文本转化为自然流畅的语音,还能通过**音频标签**精确控制情感、语速甚至加入音效,实现"演技合成”。
[![图片](https://upload.chinaz.com/2025/0606/6388479747817228256386757.png "img")](https://upload.chinaz.com/2025/0606/6388479747817228256386757.png)
[![图片](https://upload.chinaz.com/2025/0606/6388479739813195471789762.png "img")](https://upload.chinaz.com/2025/0606/6388479739813195471789762.png)
它支持**70多种语言**和**多角色自然对话**,并通过自动标签功能简化创作,有望在**影视配音**、**虚拟助手**等领域广泛应用,重新定义**AI 语音**的未来。 + +**AI前沿研究** + +1. 这篇研究论文介绍了一种名为**动态内存稀疏化(DMS)**的新方法,它通过压缩**Transformer LLM**的**KV 缓存**,在推理时实现**超扩展**,从而在相同计算资源下生成更多 Token 并提高模型准确性。该方法仅需少量训练步骤即可实现高压缩率,并显著提升了如**Qwen-R1 32B**等多种**LLM**在**AIME 24**、**GPQA**和**LiveCodeBench**等基准测试上的准确性。论文地址:[https://arxiv.org/abs/2506.05345](https://arxiv.org/abs/2506.05345)。 + +**AI行业展望与社会影响** + +1. **宇树科技 CEO 王兴兴**在第七届**北京智源大会**上表示,公司始终坚持的终极目标是让**机器人**实现家庭和工业场景的**实用化工作**,而跳舞和格斗等具身智能展示仅是训练和技术验证的手段。
[![图片](https://pic.chinaz.com/picmap/202304171730201359_10.jpg "img")](https://pic.chinaz.com/picmap/202304171730201359_10.jpg)
他透露,今年上半年**人形机器人**在商业租赁市场已初具规模并带来可观价值,未来将加速机器人实用化落地。 +2. 知名科技博主**王自如**在**B站**宣布复更,并正式更名为"**王自如AI**”,表示将以**AI 测评 UP 主**的身份开启二次创业,专注于**AI 内容创业**和**AI 应用**,助力传统产业数字化转型。
[![图片](https://upload.chinaz.com/2025/0606/6388480568808508227034081.png "img")](https://upload.chinaz.com/2025/0606/6388480568808508227034081.png)
他在视频中感谢了**董明珠**和**雷军**的鼓励和帮助,并提及此前入职格力是为重塑销售体系。 + +**开源TOP项目** + +1. **note-gen**是一款**AI 赋能**的跨平台**Markdown 笔记应用**(Stars: 3161),致力于利用**AI**将碎片化知识整理成可读笔记,连接记录与写作。项目地址:[https://github.com/codexu/note-gen](https://github.com/codexu/note-gen)。 +2. **notebooks**项目(Stars: 1174)提供了通过**Google Colab**、**Kaggle**等平台引导式**Notebook**免费微调**大型语言模型**的功能。项目地址:[https://github.com/unslothai/notebooks](https://github.com/unslothai/notebooks)。 +3. **ragbits**(Stars: 749)提供了一系列构建模块,旨在帮助开发者快速开发**生成式 AI 应用程序**。项目地址:[https://github.com/deepsense-ai/ragbits](https://github.com/deepsense-ai/ragbits)。 + +**社媒分享** + +1. 知名博主**歸藏**推荐**即梦AI**图片3.0的**智能参考**功能,该功能支持用户基于上传图像生成任何内容,并能修改照片背景、添加配饰、更改姿势,甚至精确添加或修改复杂**文字效果**。
[![Image](https://cdnv2.ruguoapp.com/FvtrC2kjbbXAClT4WeaTRXbuwUnlv3.jpeg "img")](https://cdnv2.ruguoapp.com/FvtrC2kjbbXAClT4WeaTRXbuwUnlv3.jpeg)
这一突破性能力极大地提升了日常照片分享的表现力,并能高效生成电商产品图、小红书和视频封面等**营销物料**。文章链接:[https://mp.weixin.qq.com/s/_kt9OLylR95sG7U37wseSw](https://mp.weixin.qq.com/s/_kt9OLylR95sG7U37wseSw),社交媒体链接:[https://m.okjike.com/originalPosts/6842cd91a26304532600fa4d](https://m.okjike.com/originalPosts/6842cd91a26304532600fa4d)。 +2. **Yangyi**分享了**AI 时代**的产品价值公式,指出产品价值取决于"**新体验**”(获得有效结果与美观度)和"**迁移成本**”(旧平台数据沉没成本与上手门槛)之间的差异。因此,构建高价值**AI 产品**需要提供超预期的有效结果、足够美观的界面,并致力于降低用户数据迁移的难度和产品的使用门槛。社交媒体链接:[https://x.com/Yangyixxxx/status/1930912029809979654](https://x.com/Yangyixxxx/status/1930912029809979654)。 \ No newline at end of file diff --git a/daily/2025-06-08.md b/daily/2025-06-08.md new file mode 100644 index 0000000..194600d --- /dev/null +++ b/daily/2025-06-08.md @@ -0,0 +1,17 @@ +# AI洞察日报 2025/6/8 + +**AI产品与功能更新** +1. 阿里巴巴于6月6日正式开源了全新的**千问3向量模型**系列**Qwen3-Embedding**,其在文本检索、聚类和分类等任务上的性能提升超40%,并超越谷歌和OpenAI的顶尖模型,获得了同类模型的**最佳性能**(SOTA),同时具备强大的多语言支持能力。
[![图片](https://pic.chinaz.com/picmap/202504151007236218_3.jpg "img")](https://pic.chinaz.com/picmap/202504151007236218_3.jpg)
该系列共9款模型,已在魔搭社区、Hugging Face和GitHub等平台开源,并可通过阿里云百炼使用API服务,为全球开发者提供了更高效的AI应用空间。 +2. **AI**驱动的本地视频编辑工具**Diffusion Studio Pro**正式亮相,该产品被誉为"CapCut + Cursor”结合,以本地优先、浏览器为基础的非线性编辑体验,集成了超过16种生成式**AI模型**,旨在降低创作门槛并大幅提升专业视频创作者的工作效率。其提供免费无限层级,有望成为AI驱动视频编辑的行业标杆,为创作者带来更高效、直观的创作体验。 +3. 谷歌于6月5日发布了名为**Portraits**的创新**AI产品**,用户可通过与虚拟专家进行实时对话,获得个性化的沟通技巧与领导力学习体验,首批虚拟专家基于知名畅销书作者打造。
[![图片](https://upload.chinaz.com/2025/0606/6388480752743547666381573.png "img")](https://upload.chinaz.com/2025/0606/6388480752743547666381573.png)
该产品依托谷歌先进的**生成式AI技术**,强调交互性和实践性,目前仅对美国IP用户开放测试,预示着**AI教育**将迈向更互动、更个性化的新阶段。 + +**AI前沿研究** +1. 在第七届"北京智源大会”上,智源研究院重磅推出了一系列名为"悟界”的**大模型**,其中包括原生多模态世界模型**Emu3**、脑科学多模态通用基础模型见微**Brainμ**,以及具身智能的协作框架**RoboOS2.0**和**RoboBrain2.0**等。
[![图片](https://pic.chinaz.com/picmap/202307211343352678_2.jpg "img")](https://pic.chinaz.com/picmap/202307211343352678_2.jpg)
这些模型旨在推动人工智能在医疗、教育、环境监测等多个重要领域的应用落地,展现了智源研究院在**多模态智能技术**方面的雄心和实力。 + +**开源TOP项目** +1. **react-bits**是一个拥有**12729**星的开源**React组件集合**,它提供动画、交互式且完全可定制的组件,旨在帮助开发者构建出令人惊叹且难以忘怀的用户界面。项目地址:[Link](https://github.com/DavidHDev/react-bits)。 +2. **art-design-pro**是一个拥有**1729**星的Vue 3管理后台模板,它采用Vite + TypeScript + Element Plus构建,专注于优化用户体验和视觉设计。项目地址:[Link](https://github.com/Daymychen/art-design-pro)。 + +**社媒分享** +1. 刘勿锋分享了用**Claude**画图时的一个实用小技巧:通过简单的提示词,可以指导Claude调用如**iconfont**、**Lucied React图标库**等第三方图标库,而非使用系统默认的emoji,从而大幅提升前端网页的视觉美观度和风格统一性。
[![图片](https://cdnv2.ruguoapp.com/Fmks9yCJBJ1rO-T5g9BP9epCxci-v3.png "img")](https://cdnv2.ruguoapp.com/Fmks9yCJBJ1rO-T5g9BPepCxci-v3.png)

[![图片](https://cdnv2.ruguoapp.com/FqkHGytOOk8dLy3WejWlcbSLAIBqv3.png "img")](https://cdnv2.ruguoapp.com/FqkHGytOOk8dLy3WejWlcbSLAIBqv3.png)
更多详情请访问:[Link](https://m.okjike.com/originalPosts/68444463dfa0f1ef3adbbf9b)。 +2. wwwgoubuli预估接下来社交媒体上将出现两种热门内容:一部分是深入分析**作文题目**的讨论,另一部分则是围绕**AI写作文**展开的创作比拼,展现了对当前AI应用趋势的敏锐观察。更多信息:[Link](https://x.com/wwwgoubuli/status/1931206161044484395)。 \ No newline at end of file diff --git a/daily/2025-06-09.md b/daily/2025-06-09.md new file mode 100644 index 0000000..add6ed8 --- /dev/null +++ b/daily/2025-06-09.md @@ -0,0 +1,24 @@ +# AI洞察日报 2025/6/9 + +**AI产品与功能更新** +1. **OpenAI** 宣布 **ChatGPT** 高级语音功能升级,显著提升了语音交互的自然性和流畅度,使其**语调更自然、节奏更真实、情绪表达更丰富**,并加入了**双向自动翻译**功能,能持续进行多轮对话翻译,无需重复指令,特别适用于国际出行、远程办公和语言学习等场景。 +2. 面壁智能于6月6日发布了 **MiniCPM 4.0系列** 模型,包括8B稀疏版和0.5B轻巧版,在端侧性能上实现了**极限情况下220倍、常规5倍的速度提升**,通过**系统级稀疏创新**和高效双频换挡技术,大幅减少了端侧存储需求,并已成功适配Intel、高通等主流芯片。 +
[![图片](https://upload.chinaz.com/2025/0608/6388497352726253514384248.png "img")](https://upload.chinaz.com/2025/0608/6388497352726253514384248.png)
+ +**开源TOP项目** +1. **tensorzero** ([Link](https://github.com/tensorzero/tensorzero)) 是一款拥有4869个Star的项目,它为LLM应用创建了一个**反馈循环**,旨在将生产数据转化为更智能、更快、更经济的模型。 +2. **HumanSystemOptimization** ([Link](https://github.com/zijie0/HumanSystemOptimization)) 是一个拥有15170个Star的项目,提供了一份名为"**健康学习到150岁**”的**人体系统调优指南**。 +3. **omni-tools** ([Link](https://github.com/iib0011/omni-tools)) 拥有2940个Star,它提供了一套**自托管的网页工具集**,用于日常任务,强调**无广告、无跟踪**,且可在浏览器中快速便捷使用。 +4. **BlackFriday-GPTs-Prompts** ([Link](https://github.com/friuns2/BlackFriday-GPTs-Prompts)) 是一个拥有7018个Star的项目,提供了**无需Plus订阅即可使用的免费GPTs列表**。 + +**社媒分享** +1. ginobefun分享了关于 **RAG技巧与底层代码剖析** 的文章([Link](https://x.com/hongming731/status/1931695593300295887)),强调通过手写代码理解RAG核心逻辑,并详细介绍了**语义分块**与**上下文增强检索**如何提升大模型问答质量。 +2. 黄赟认为 **AI数字人** 将成为电商平台的标配([Link](https://x.com/huangyun_122/status/1931651642912575799)),并提到近期**AI主播被"开发者模式”玩坏**的现象,导致技术服务商需紧急修复漏洞。 +3. 歸藏展示了 **FLUX kontext** 在修改汽车宣传图方面的强大能力([Link](https://m.okjike.com/originalPosts/684554a3f2a4a64de9113b05)),能将汽车背景更换为黄昏沙滩或赛道,并智能地为行驶中的车轮**添加运动模糊效果**。 +
[![图片](https://cdnv2.ruguoapp.com/FgYlujbzq6TyHy_7vk80onRQz2s0v3.png "img")](https://cdnv2.ruguoapp.com/FgYlujbzq6TyHy_7vk80onRQz2s0v3.png)
+
[![图片](https://cdnv2.ruguoapp.com/Frl3Mso4Vw3AJ0TMEhauKTMf1KJSv3.png "img")](https://cdnv2.ruguoapp.com/Frl3Mso4Vw3AJ0TMEhauKTMf1KJSv3.png)
+4. izx-copy分享了Google的建议([Link](https://m.okjike.com/originalPosts/684547c3380c5253de2afdb8)),鼓励开发者直接使用其高质量的**深度研究代码库**,而非自行开发,认为其比"vibe coding”版本更优。 +
[![图片](https://cdnv2.ruguoapp.com/Fq5xvk7MirT9ygZ10T5hIx3lWRlvv3.jpg "img")](https://cdnv2.ruguoapp.com/Fq5xvk7MirT9ygZ10T5hIx3lWRlvv3.jpg)
+5. Yangyi呼吁开发 **"睿智的AI”** ([Link](https://x.com/Yangyixxxx/status/1931568827126743513)),即能够**快速识别幻觉和虚假信息**的AI,并提出了**AI幻觉专家网络**的概念,认为这能帮助AI自主辨别信息真伪,提升输出可靠性。 +6. pimgeek转发了一篇关于公司**用ChatGPT替代客服导致翻车**的文章([Link](https://mp.weixin.qq.com/s/68NngKn8nhZEziLkRvBcTg)),文章指出用户更倾向于与真人客服沟通,数据显示多数用户不希望产品引入AI客服,甚至会因此考虑更换竞争对手。 +
[![图片](https://mmbiz.qpic.cn/mmbiz_jpg/kKoeb9t5fNrx85xJ2bibZStRvd1w55tu3rasGH4r7WyxZ3ECSxozia6DZvicBZcXVKhsUSCSKw47gnesic2RfDztsQ/0?wx_fmt=jpeg "img")](https://mmbiz.qpic.cn/mmbiz_jpg/kKoeb9t5fNrx85xJ2bibZStRvd1w55tu3rasGH4r7WyxZ3ECSxozia6DZvicBZcXVKhsUSCSKw47gnesic2RfDztsQ/0?wx_fmt=jpeg)
\ No newline at end of file diff --git a/daily/2025-06-10.md b/daily/2025-06-10.md new file mode 100644 index 0000000..4c578ef --- /dev/null +++ b/daily/2025-06-10.md @@ -0,0 +1,50 @@ +# AI洞察日报 2025/6/10 + +**AI产品与功能更新** + +1. Google 近日调整 **AI 模型**使用政策,自5月起,**Google AI Studio** 已停止向免费用户提供 **Gemini 2.5 Pro** 系列模型调用权限,未来开发者需自行提供 **API 密钥**接入服务。此举引发了开发者社区的广泛关注,分析认为这是 Google 推动 **Gemini** 商业化进程、将高性能模型纳入付费体系的信号。 +
[![图片](https://pic.chinaz.com/picmap/202312070835429226_0.jpg "img")](https://pic.chinaz.com/picmap/202312070835429226_0.jpg)
+ +2. 据官方数据显示,阿里旗下**通义千问3**大模型开源仅一个月,其全球累计下载量已突破**1250万次**,并在 Hugging Face 等主流 **AI** 开源平台上,衍生模型数量超过**13万个**,跃居全球第一。这一爆发式增长不仅代表着国产大模型的开源实力正与国际水平接轨,也进一步巩固了阿里在全球 **AI 基础模型生态**中的影响力。 +
[![图片](https://pic.chinaz.com/picmap/202504151007248027_6.jpg "img")](https://pic.chinaz.com/picmap/202504151007248027_6.jpg)
+ +3. 轻量级文档解析模型 **MonkeyOCR** 近日震撼登场,它以仅**3B参数**的轻量级架构,在英文文档解析任务中展现出惊艳性能,超越了 **Gemini 2.5 Pro** 等重量级模型,并大幅提升了处理速度。其核心创新在于采用"**结构-识别-关系**”三元组范式,这不仅提升了解析准确率,还显著降低了计算资源需求,为中小型企业部署 **AI** 文档解析解决方案提供了可能。 +
[![图片](https://upload.chinaz.com/2025/0609/6388506551370676562538551.png "img")](https://upload.chinaz.com/2025/0609/6388506551370676562538551.png)
+ 论文链接:[https://arxiv.org/abs/2506.05218](https://arxiv.org/abs/2506.05218) + +4. 在近期一场采用2025年高考新课标Ⅰ卷客观题的数学挑战中,**字节**的**豆包**和**腾讯**的**元宝**表现出色,以68分的成绩并列第一,充分展现了其在复杂推理场景下的潜力。此次比赛不仅揭示了各大 **AI 模型**在高考数学上的能力与不足,也反映出它们在细节处理、公式应用和逻辑推理方面的显著进步,为未来 **AI 数学能力**的发展奠定了基础。 +
[![图片](https://upload.chinaz.com/2025/0609/6388506262201100345390287.png "img")](https://upload.chinaz.com/2025/0609/6388506262201100345390287.png)
+
[![图片](https://upload.chinaz.com/2025/0609/6388506263798259217980699.png "img")](https://upload.chinaz.com/2025/0609/6388506263798259217980699.png)
+ +**AI行业展望与社会影响** + +1. 架构师**罗伯特・卡鲁索**近日进行了一项跨时代实验,结果显示1977年推出的**Atari 2600**游戏机国际象棋引擎轻松击败了 **OpenAI** 的 **ChatGPT**。**ChatGPT** 在比赛中频繁犯错、混淆棋子,这引发了公众对**复古科技**与**现代 AI** 棋艺水平的讨论和反思。 +
[![图片](https://pic.chinaz.com/picmap/202307141649254569_3.jpg "img")](https://pic.chinaz.com/picmap/202307141649254569_3.jpg)
+ +2. 博主 **wwwgoubuli** 认为 **AI 编程代理**正进入平台期,尽管当前模型如 **Gemini 2.5 Pro** 和 **Claude** 表现强劲,但模型层面的"飞升”空间有限。他预计未来将有更多产品井喷式发展,而重点在于**载体**、**媒介**和 **IDE/plugin** 等方面的完善,而非核心模型能力的突破。 + [Link](https://x.com/wwwgoubuli/status/1931898011904598439) + +**开源TOP项目** + +1. **vosk-api** 是一个拥有**10342**颗星的开源项目,它提供适用于 **Android**、**iOS**、**树莓派**和服务器的**离线语音识别 API**,并支持 **Python**、**Java**、**C#** 和 **Node** 等多语言开发。 + [Link](https://github.com/alphacep/vosk-api) + +2. **RAG_Techniques** 是一个拥有**17002**颗星的开源项目,该仓库展示了**检索增强生成(RAG)系统**的各种先进技术。它结合了**信息检索**和**生成模型**,旨在为用户提供更加准确且上下文丰富的 **AI** 回复。 + [Link](https://github.com/NirDiamant/RAG_Techniques) + +3. **Seelen-UI** 是一个拥有**7257**颗星的开源项目,它提供了一个**完全可定制**的**桌面环境**,专为 **Windows 10/11** 用户设计,让用户能够打造个性化的操作界面。 + [Link](https://github.com/eythaann/Seelen-UI) + +4. **Meng Shao** 分享了5个精选的**开源项目**,旨在帮助 **AI 工程师**提升技能并获得"超能力”,尤其是在 **LLMs** 和生成式 **AI Agent** 领域。这些项目涵盖了从 **LLM** 基础知识、**AI Agent** 构建、生产级机器学习应用部署到**提示工程**等关键学习资源。 +
[![图片](https://pbs.twimg.com/media/Gs-Kw91bEAAfXUe?format=jpg&name=orig "img")](https://pbs.twimg.com/media/Gs-Kw91bEAAfXUe?format=jpg&name=orig)
+ [Link](https://x.com/shao__meng/status/1931915369754870114) + +**社媒分享** + +1. 博主**归藏**详细介绍了如何在 **Liblib** 平台在线使用 **FLUX Kontext** 工具进行图片修改,无需本地运行 **Comfyui**,并分享了涵盖单图、双图、三图融合及图片放大功能的**工作流**。**Liblib** 上线的 **Kontext** 提供了便捷的在线处理能力,旨在帮助用户轻松掌握图片创作的各种高级技巧。 +
[![图片](https://cdnv2.ruguoapp.com/FgPX1CCXdu_RYpd92XdLLAZ2RFbBv3.png "img")](https://cdnv2.ruguoapp.com/FgPX1CCXdu_RYpd92XdLLAZ2RFbBv3.png)
+ [Link](https://m.okjike.com/originalPosts/68468cf4747af0f12129117c) + +2. **Tw93** 推荐了 **PayQrcode** 方案,该方案通过**物理图片合并技术**,成功将**微信**与**支付宝**收款码融合为单张图片,实现了线下离线场景下的**双码兼容识别**。这项创新解决了传统双码不便的问题,并经本地测试证明识别效果良好,极大地提升了支付便利性。 +
[![图片](https://pbs.twimg.com/media/Gs7XEppbgAA10Zw?format=jpg&name=orig "img")](https://pbs.twimg.com/media/Gs7XEppbgAA10Zw?format=jpg&name=orig)
+ [Link](https://x.com/HiTw93/status/1931860291278823822) \ No newline at end of file diff --git a/daily/2025-06-11.md b/daily/2025-06-11.md new file mode 100644 index 0000000..8fba683 --- /dev/null +++ b/daily/2025-06-11.md @@ -0,0 +1,47 @@ +# AI洞察日报 2025/6/11 + +**AI产品与功能更新** +1. **豆包大模型家族**将在2025 FORCE原动力大会上,重磅发布全新的**豆包·视频生成模型**。这款模型可谓"创意魔法棒”,它凭借高效结构和多任务统一建模等黑科技,不仅支持**无缝多镜头叙事**,还能**精准响应多动作**,甚至能像专业摄影师一样**随心运镜**,轻松生成写实、动漫等多种风格的**高品质视频**,简直是视频创作者的福音! +
[![图片](https://upload.chinaz.com/2025/0610/6388517021358447365987976.png "img")](https://upload.chinaz.com/2025/0610/6388517021358447365987976.png)
+2. xAI开发的**Grok**人工智能正大刀阔斧地接管X平台的**推荐算法**,同时优化了评论排序机制。这意味着,平台将优先推荐**高质量内容**,而非仅仅看粉丝量,这无疑给那些粉丝较少但有真材实料的"小号”和新人带来了前所未有的曝光机会,旨在打造一个更公平、更开放的内容生态,让好内容不再"蒙尘”。 +
[![图片](https://upload.chinaz.com/2025/0610/6388514989498792027745193.png "img")](https://upload.chinaz.com/2025/0610/6388514989498792027745193.png)
+3. **豆包App**近期也对"一句话P图”功能进行了全面升级,它基于强大的SeedEdit 3.0模型,新增了一键添加/替换文字、质感风格迁移和局部图像编辑增强等一系列酷炫修图玩法。这波升级简直是把专业修图师请进了手机,让普通用户也能无需专业技能,轻松搞定个性化照片创作,让"修图小白”也能变身"修图大师”。 +
[![图片](https://upload.chinaz.com/2025/0610/6388514703219058043604298.png "img")](https://upload.chinaz.com/2025/0610/6388514703219058043604298.png)
+4. 苹果在WWDC 2025大会上带来了iOS 26系统的"杀手级”功能——**视觉智能**。有了它,你可以在屏幕上的任何图片或信息上进行提问、搜索,甚至自动识别事件详情,简直是手机的"智能眼”。这项升级通过AI技术实现了屏幕内容的"一眼识别”,大大提升了交互体验的便捷性与智能化程度,还能自动提取事件信息加入日历,让你的数字生活更加省心。 +
[![图片](https://upload.chinaz.com/2025/0610/6388514197880401555868249.png "img")](https://upload.chinaz.com/2025/0610/6388514197880401555868249.png)
+5. 好消息!**沉浸式翻译**迎来重大更新,现在已能对**推特(X)视频**进行**实时翻译**。即便视频没有原生字幕,它也能帮你"神同步”地显示**中英双语字幕**。这下,刷X平台视频再也不用担心语言不通了,简直是跨文化交流的"神助攻”,彻底消除了语言障碍,让世界更近。 + [Link](https://x.com/imxiaohu/status/1932299897388277804) + +**AI前沿研究** +1. 香港大学和华为诺亚方舟实验室强强联手,推出了颠覆性的**FUDOKI**模型。这款模型采用**非掩码离散流匹配架构**,成功突破了传统自回归模型的束缚,实现了更加灵活高效的**多模态生成与理解**能力。它通过独特的**并行去噪机制**,显著提升了复杂推理和生成任务的表现,尤其在**图像生成**方面表现惊艳,为未来**通用人工智能**的发展铺平了道路。 +
[![图片](https://pic.chinaz.com/picmap/202405161743136484_4.jpg "img")](https://pic.chinaz.com/picmap/202405161743136484_4.jpg)
+2. 香港科技大学和快手科技的研究团队联合发布了**EvoSearch(进化搜索)技术**,这简直是AI作画领域的一股清流!它彻底颠覆了以往"大模型、大算力”的固有思维,巧妙地将达尔文的进化论思想融入AI生成过程,让那些"小个子”模型也能生成超越甚至媲美"大块头”的**高质量图像和视频**。这项突破性技术有望开启AI创作的**"智能进化”时代**,让AI模型在推理阶段释放更深层次的潜力。相关项目主页、代码和论文链接已发布:[https://tinnerhrhe.github.io/evosearch/](https://tinnerhrhe.github.io/evosearch/)、[https://github.com/tinnerhrhe/EvoSearch-codes](https://github.com/tinnerhrhe/EvoSearch-codes)、[https://arxiv.org/abs/2505.17618](https://arxiv.org/abs/2505.17618)。 +
[![图片](https://upload.chinaz.com/2025/0610/6388516498517715873339996.png)](https://upload.chinaz.com/2025/0610/6388516498517715873339996.png)
+
[![图片](https://upload.chinaz.com/2025/0610/6388516503306155376085044.png)](https://upload.chinaz.com/2025/0610/6388516503306155376085044.png)
+3. 一篇名为"**玩中泛化:通过游戏学习推理**”的学术论文揭示了令人兴奋的发现:**多模态大型语言模型(MLLMs)**通过玩简单的**街机游戏**,竟然能**显著提升其跨领域的多模态推理能力**,甚至超越了在特定数据上训练的**专业模型**!这无疑为未来**通用AI能力的培养**指明了一条充满趣味的新方向,让AI在"玩乐”中变得更聪明。 + [此链接](https://arxiv.org/abs/2506.08011) +4. 新论文《梦境之地》(**Dreamland**)提出了一种结合物理模拟器与大型生成模型的混合框架。它的目标是创造出高度可控且逼真的动态虚拟世界,不仅显著提升了图像质量与可控性,更重要的是,有望为**具身AI智能体**的训练提供一个理想的"游乐场”和"实验室”,助力AI在现实世界中更好地学习和行动。 + [Link](https://arxiv.org/abs/2506.08006) + +**AI行业展望与社会影响** +1. 理想汽车近期进行了组织架构的"大变身”,正式成立了**"空间机器人”**和**"穿戴机器人”**两个全新的二级部门。这不仅仅是部门调整,更预示着理想汽车正从传统的汽车制造商转型为**智能出行生态构建者**。他们旨在通过机器人技术,构建一个涵盖车内"第三空间”和车外智能穿戴设备的完整智能生活服务体系,这无疑将为理想汽车在竞争激烈的市场中带来新的差异化优势,让"第三空间”战略不再只是一个概念。 +
[![理想汽车](https://pic.chinaz.com/picmap/202105061137083176_6.jpg)](https://pic.chinaz.com/picmap/202105061137083176_6.jpg)
+2. 俄亥俄州立大学宣布从今年起,将强制所有学生接受**人工智能(AI)培训**,这简直是为未来职场"量身定制”的技能包!学校推出了**"AI流利度”计划**,将AI教育全面融入本科生课程,旨在培养学生将专业知识与AI技术有效结合的能力。当然,学校也强调学生不得利用生成性AI来"蒙混过关”,同时加强教师培训以维护**学术诚信**。此举旨在确保每位毕业生都能在其专业领域有效应用AI,并积极响应俄亥俄州AI教育联盟在K-12教育中推动AI教育的努力,让AI真正成为每个人的"超级助手”。 +
[![学习 考试 高考 教育 (1)](https://pic.chinaz.com/picmap/202306251749094253_12.jpg)](https://pic.chinaz.com/picmap/202306251749094253_12.jpg)
+3. 知名思考者李继刚一针见血地指出,当AI技术变得越发**高效强大**时,人类的**判断力**、**品味**和对事物**目的的理解**反而会变得更为**硬核**。因为AI虽然能生成万千方案并完美执行,却无法替代人类进行**选择**、定义**美**,更无法洞悉复杂且深邃的**人性**。这提醒我们,在AI时代,真正有价值的,或许正是那些AI无法企及的"人类专属技能”。 + [Link](https://m.okjike.com/originalPosts/68480c352b31fa0880f554c5) + +**开源TOP项目** +1. 小红书的 hi lab 团队近日献出了一份"大礼”——首个开源文本大模型**dots.llm1**!这款拥有1420亿参数的**混合专家(MoE)语言模型**,在海量真实数据训练后,其性能竟然能媲美阿里巴巴的Qwen2.5-72B,这简直是模型界的"黑马”!此次开源不仅彰显了小红书在人工智能领域的技术雄心,更旨在提供更智能化的服务,并激励开发者们一起加入AI研究的"大合唱”。 +
[![图片](https://pic.chinaz.com/picmap/201811151633429180_32.jpg "img")](https://pic.chinaz.com/picmap/201811151633429180_32.jpg)
+2. 近期,GitHub上两个**AI相关**的项目人气爆棚。其中,拥有10785星的"**newsnow**”项目,它旨在为用户提供**优雅的实时热点新闻阅读体验**,让信息获取既便捷又高效,简直是"新闻控”的福音,地址在这里:[此链接](https://github.com/ourongxing/newsnow)。另一个是"**GenAI_Agents**”项目,以12884星的高热度,为开发者提供了**从基础到高级的生成式AI智能体技术教程与实现**,旨在赋能构建更智能的**交互式AI系统**,详情可访问:[此链接](https://github.com/NirDiamant/GenAI_Agents)。 + +**社媒分享** +1. Gorden Sun在社交媒体上分享了**Mirage**虚拟人模型产品,这款产品简直是"数字分身”的魔法师!它能通过音频驱动,生成生动、嘴型同步且表情丰富的**虚拟人视频**,栩栩如生。Gorden Sun还特别强调,该产品的详细技术报告对研究人员具有极高的参考价值,看来又将引发一场虚拟人技术的"军备竞赛”。 + [Link](https://x.com/Gorden_Sun/status/1932446920884334635) +2. Sam Altman在X平台发文宣布,**o3产品**价格已大幅下调80%,这简直是"福利大放送”!他表达了对用户创新使用的期待,并预告了**o3-pro版本**也将提供令人满意的定价。看来,Sora之父又在鼓励大家放开手脚,用更低的成本去探索AI的无限可能了。 + [Link](https://x.com/sama/status/1932434606558462459) +3. Ryan ᵐᶠᵉʳ 🦄d/acc抛出了一个关于**下一代创业者**的深刻观点:他们不应被束缚于模仿乔布斯等前代成功模式,也不应受限于**有限的低质量输入**,而应**忠于自我**,以**独特**的"vibe”和**玩乐精神**去**自由探索**。这就像在说,别做别人的影子,去创造属于你自己的"游戏规则”! + [Link](https://x.com/RyanMfer/status/1932387601341984815) +4. 用户wwwgoubuli分享了AI在实际工作中的一个有趣转变。他提到,远程团队成员初时因担心被视为偷懒而**不敢充分使用AI**,但在他多次分享AI"正确用法”后,团队逐渐"放开手脚”,结果代码的**注释、规范和质量**均显著提升,同事们也展现出更高的**自信**。这简直是AI赋能团队效率提升的"教科书式”案例,打破了心中的"AI焦虑”。 + [Link](https://x.com/wwwgoubuli/status/1932358909865480333) \ No newline at end of file diff --git a/podcast/2025-06-01.md b/podcast/2025-06-01.md new file mode 100644 index 0000000..8322bbf --- /dev/null +++ b/podcast/2025-06-01.md @@ -0,0 +1,83 @@ +# 来生小酒馆 2025年6月1日 + +AI现在看图、读表的能力怎么样了?它真的能像我们一样理解并“推理”吗? + +当AI成为我们工作的好伙伴时,它究竟是我们的“外脑”,还是终将取代我们? + +未来,AI的研究方向,会如何回应我们对“智能”的期待,又将如何影响我们的社会和经济? + +嘿,亲爱的V,欢迎收听新一期的来生情报站!我是你的老朋友,又来给你播报未来情报了。今天咱们聊聊AI的最新动态,嗯,有惊喜,也有思考。 + +首先啊,咱们得说说最近通义实验室的一个大动作,他们发布并开源了一个叫**VRAG-RL**的东西,听起来有点复杂对吧?其实简单来说,就是想解决AI从图像、表格这些“视觉语言”里,怎么才能更聪明地找出关键信息,并且进行更精细的分析和判断。你想啊,我们人看一张图,一下就知道重点在哪儿,可AI之前在这方面就有点“笨拙”,但现在有了这个VRAG-RL,它通过强化学习和创新的视觉感知机制,嘿,理解和检索效率显著提升了!据说在很多测试里都表现出色,未来在处理各种视觉任务时,AI的“举一反三”能力,也就是泛化能力,会变得更强,想想就觉得挺酷的,对吧? + +不过话说回来,就在我们为AI的这些进步欢呼的时候,亚利桑那州立大学的一个研究小组,就给我们泼了一点“冷水”。他们发了篇论文指出,我们现在天天在用、觉得特智能的**大语言模型**,其实并没有进行真正的“推理”。它只是在寻找数据之间的相关性,有点像在找规律,而不是真的在思考。这个发现嘛,可能会导致公众对AI的工作机制产生一些误解。所以啊,研究人员就强调了,在咱们越来越依赖AI的时代,对待这些技术能力,得更谨慎一些。他们也希望未来的AI研究能朝着更具“解释性”的方向发展,让AI不光能告诉我们答案,还能告诉我们“为什么”得出这个答案。我觉得这个提醒非常重要,毕竟知其然还要知其所以然嘛。 + +但同时,AI在提升我们工作效率这方面,真的是没停下来。比如说,**Perplexity AI**,他们最近就推出了一个新功能叫**Perplexity Labs**。你知道Perplexity以前是个答案引擎,就是你问它问题,它给你答案。但现在它变了,变成了一个能帮你从创意到成果,提供“全链条支持”的**综合性AI生产平台**。Pro订阅用户可以使用这个功能,它能通过多工具协同,把复杂项目的开发流程简化到几分钟,是不是听着就觉得效率倍增? + +类似的还有咱们国内的**夸克**,也上线了一个叫“**深度研究**”的功能。这个功能是基于通义千问大模型的,能围绕一些复杂的学术课题啊、行业分析啊,自动完成从资料搜集到**报告生成**的全流程研究。这可真是厉害了,以前我们可能要花几天甚至几周时间,现在AI能给你搞定。这标志着AI正从一个单纯的**信息检索工具**,变成一个能跟你一起**创作内容的伙伴**,想想科研调研、市场洞察这些场景,效率肯定蹭蹭地往上涨。 + +而且,开发者们也有福利了!**阿里云**正式发布了**通义灵码 AI IDE**,这是一款原生的人工智能开发环境。它凭借强大的**编程智能体模式**、**长期记忆**和**行间建议预测**功能,能显著提升开发者的编程效率。它已经**免费开放下载**了,而且听听这数据:它的插件累计生成了超过30亿行代码!这说明它有多受欢迎,真的是企业开发工作的强力支持。 + +再来说个特别有意思的,一款叫**Memvid**的**AI记忆工具**。你可能想象不到,它竟然能把**文本数据编码成MP4视频**。没错,就是视频!这样做有什么好处呢?它能实现亚秒级的快速语义搜索,而且还大大节省存储空间,甚至支持离线使用。它内置了聊天功能,还能导入PDF文档。这简直就是为我们高效管理知识、进行学术研究提供了革命性的全新可能啊,有没有觉得很神奇? + +不过,有光明就有阴影,关于AI对社会影响的担忧,也一直没断过。Anthropic公司的CEO,达里奥・阿莫代伊就发出了一个警告。他认为,AI可能在未来五年内**取代一半入门级白领工作**,这可能会导致**失业率飙升**到10%-20%,并且加剧**经济不平等**。他呼吁大家提高对AI发展的认知和AI素养,这样我们才能更好地适应未来的职业环境。他也强调,政策制定者们需要开始思考,在这样一个“超智能经济”下,该怎么找到解决方案。这个嘛,确实值得我们每个人深思。 + +当然啦,AI带来的便利也是实实在在的。比如AI初创公司**Manus**,就推出了一个**Manus Slides**功能。你只需要一个提示词,就能**一键生成专业幻灯片**,无论是商务会议还是教育课程,都能搞定,这效率提升得简直不是一点半点。它有智能生成和灵活编辑的能力,还能导出PowerPoint或者PDF。这说明AI代理啊,正在从任务自动化,向更高级的生产力工具进一步演进,真的越来越像我们的“私人助理”了。 + +除了这些商用产品,开源社区也一直没闲着。在GitHub上,有几个项目特别受欢迎。 + +第一个是拥有**7086颗星**的**prompt-eng-interactive-tutorial**,这是Anthropic公司开源的一个**交互式提示工程教程**项目,专门帮助大家有趣又有效地学习怎么跟AI“对话”,也就是提示工程。 + +第二个是获得**10143颗星**的**onlook**项目,这是一个**开源可视化氛围编码编辑器**。它利用AI帮助设计师或开发者**可视化地构建、美化和编辑React应用**。这个工具就像是设计师的光标,让React开发变得更直观高效。 + +还有啊,拥有**12755颗星**的**anthropic-cookbook**项目,这是Anthropic公司专门展示如何有趣且有效地使用Claude的**笔记本/秘籍集合**,各种使用方法,应有尽有。 + +最后,咱们再聊两个AI前沿研究的进展。 + +一个是**MMSI-Bench**,这是一个针对**多图像空间智能**的VQA基准测试。研究发现,虽然现在多模态大语言模型(就是那种又能看图又能理解文字的AI)取得了很大进展,但在处理**多图像空间推理**方面,它们的准确率只有30%-40%,而人类能达到97%。这说明AI和人类之间,在理解多张图像之间的空间关系上,还存在着巨大的差距。这项研究也诊断出了模型四种主要的失败模式,为未来提升AI的这个能力提供了宝贵的见解。 + +另一个是**ZeroGUI**,这是一个创新的**在线学习框架**。它厉害的地方在于,可以实现**零人力成本地自动化GUI智能体训练**。啥意思呢?就是让AI自己学习怎么操作电脑界面,不需要人类手动去标注。它通过基于VLM的自动任务生成和奖励评估,克服了传统GUI学习对人工标注的重度依赖。实验证明,这个框架显著提升了GUI智能体在不同环境下的性能,为自动化GUI操作带来了高效的解决方案。 + +还有一个很关键的,是针对**Transformer**架构设计的高容量**长期记忆模块**,叫**ATLAS**。我们都知道,AI在处理长文本的时候,有时候会“记不住”前面的内容,就像人类的短期记忆一样。ATLAS就是来解决这个问题的,它通过优化记忆上下文,来克服现有模型在**长序列理解**上的局限,从而在测试时学习最优的记忆策略。实验结果表明,ATLAS在语言建模和长上下文理解等任务中表现优于其他模型,显著提升了性能。这让AI能够更好地理解长篇大论,而不是顾此失彼。 + +嗯,听完这些,是不是对AI的现在和未来有了更清晰的认识呢?它既是效率的倍增器,也是一个需要我们审慎对待、不断学习和适应的伙伴。 + +今天的情报就到这里,注意隐蔽,赶紧撤离。 + +本期关键词: +#AI +#大语言模型 +#VRAG-RL +#视觉感知 +#多模态RAG推理框架 +#精细化推理 +#泛化能力 +#真正推理 +#Perplexity_AI +#Perplexity_Labs +#AI生产力工具 +#夸克 +#深度研究 +#报告生成 +#内容创作伙伴 +#阿里云 +#通义灵码_AI_IDE +#编程效率 +#Memvid +#AI记忆工具 +#文本数据编码 +#语义搜索 +#Anthropic +#失业率 +#AI素养 +#Manus_Slides +#幻灯片 +#提示工程 +#可视化 +#MMSI-Bench +#多图像空间智能 +#ZeroGUI +#GUI智能体 +#ATLAS +#长期记忆模块 +#长序列理解 \ No newline at end of file diff --git a/podcast/2025-06-02.md b/podcast/2025-06-02.md new file mode 100644 index 0000000..a4ee8f0 --- /dev/null +++ b/podcast/2025-06-02.md @@ -0,0 +1,28 @@ +# 来生小酒馆 2025年6月2日 + +当AI让艺术创作触手可及,人人都是“艺术家”的时候,我们还能定义什么是真正的原创吗? +AI的能耗即将赶超比特币挖矿,甚至黑客能把恶意代码藏进AI模型里,这股我们亲手点燃的“智慧之火”,未来真能被我们驾驭得住吗? +当AI连高等数学题都能秒解,却对一个简单的回文谜题“抓耳挠腮”时,它到底离真正的人类智能还有多远?我们又该如何定义“智能”的边界呢? + +嘿,亲爱的V,欢迎收听新一期的来生情报站,我是你们的老朋友,何夕2077。最近啊,AI圈子里真是热闹非凡,感觉每天都在上演“变形金刚”升级大战,不过这次的主角不是汽车人,而是各种AI模型和功能。 + +先说说这AI产品,那真是越来越接地气了。Runway公司最新推出了个“Gen-4References”功能,啥意思呢?就是你拿起手机,拍张照片,然后用嘴巴跟AI说几句,比如“给我来个梵高画风的自拍”,或者“把我家猫咪变成赛博朋克风的侠客”,咔嚓一下,风格一致的艺术作品就出来了!哎哟,这以后是不是人人都能当“艺术家”了?以前咱们想P个图还得学Ps学得头晕眼花,现在倒好,动动手指,人人都是“毕加索”了。美术学院的同学们,是不是得考虑改行教AI画画了? + +然后是Anthropic,他们家那个旗舰模型Claude,也挺有意思。现在开发者可以直接跟Claude“聊天”,让它帮你搭AI应用。这不就是把“AI小助手”升级成了“AI“大管家”嘛!想想都美,以后咱们这些码农,是不是就不用那么辛苦了,跟AI聊聊天,活儿就干完了?不过话说回来,这AI要是也学会了摸鱼,那可咋整?它要是跟我说,“何夕啊,今天我‘算力不足’,歇会儿吧”,那我可就真的无语凝噎了。 + +要说最让人“肃然起敬”的,还得是咱们华为。他们展示了个“昇腾 + Pangu Ultra MoE”系统,一个近万亿参数的大模型,在不用GPU的情况下,仅仅2秒钟就能解一道高等数学题!我的天,我高考那会儿要是能有这AI,清华北大还不是随便挑?这简直就是“学霸AI”啊,让那些数学老师都得“退避三舍”,是不是以后孩子们学高数,直接跟AI喊一句:“AI,这题咋解?”秒出答案!这不就是AI界的“扫地僧”吗?深藏不露,一出手就惊人! + +但是啊,这些AI也不是万能的。你看有个研究就发现,视觉-语言模型(VLM)啊,对付咱们这种“回文谜题”,就有点“傻眼”。你说它能解高数题,能画画,可遇到需要“抽象推理”、“横向思维”的,它就卡壳了。就像咱公司里总有那么几个“技术大拿”,代码写得飞起,可一到猜谜语、搞脑筋急转弯,就抓耳挠腮了。所以说,AI还有很多路要走呢,它离真正的人类“聪明”,还差那么一点点“烟火气”。 + +当然,也有好消息。比如那个LoRAShop,简直就是个AI界的“美图秀秀”,它能把好几个主题、风格无缝融合到一张图里,而且不破坏背景。简直就是“乾坤大挪移”啊!还有DeepTheorem,用自然语言教AI数学证明,让大型语言模型去解IMO级别的非正式定理。哎,这以后是不是连数学家都得“卷”起来,跟AI比谁先证明出“哥德巴赫猜想”啊? + +不过话说回来,AI这玩意儿,真是个“电老虎”。有个专家就说了,到2025年底,AI的耗电量可能要占到全球数据中心总电力消耗的一半,甚至超过比特币挖矿。比特币那玩意儿多费电啊,AI居然能超过它!这要是夏天用AI画画,是不是得先交个电费预付款啊?以后咱们公司空调开低一度,是不是就等于为AI事业做贡献了?这可真是,“成也萧何,败也萧何”,科技发展了,咱们的电费账单也跟着“蹭蹭”往上涨啊。 + +更让人担忧的,是AI安全问题。最近不是有黑客伪装成阿里云AI SDK,把恶意代码藏在Pickle格式的ML模型里,偷用户敏感信息嘛!这可真是“道高一尺魔高一丈”啊。以前咱们防病毒软件,现在还得防“AI病毒”。你说这以后,咱下个AI模型,是不是得先请个“AI安全专家”来给看看,有没有“后门”、“木马”啥的?这AI就像个武功盖世的侠客,是行侠仗义还是为非作歹,就看谁手里拿着那把“钥匙”了。 + +当然,AI发展这么快,也离不开那些开源社区的贡献,什么Anthropic的教育课程项目啊,AI框架agent-zero啊,还有那个啥“秘密知识之书”,GitHub上都几万几十万星了。这说明什么?说明AI的世界,就是一群人在“头悬梁锥刺股”地学习、创造啊! + +今天的情报就到这里,注意隐蔽,赶紧撤离。 + +本期关键词: +#Runway #Gen-4References #AI生成技术 #AI创作 #Anthropic #Claude #AI应用程序 #AI Studio #AI应用开发 #华为 #昇腾 #Pangu Ultra MoE #MoE大模型 #GPU #视觉-语言模型 #VLM #抽象推理 #横向思维 #视觉隐喻 #LoRAShop #多概念图像编辑框架 #修正流Transformer #LoRA权重 #图像生成 #编辑 #DeepTheorem #自然语言 #强化学习 #RL-Zero #大型语言模型 #LLM #定理证明框架 #IMO #电力消耗 #数据中心 #比特币挖矿 #阿里云AI SDK #恶意软件包 #供应链攻击 #Pickle #恶意代码 #AI安全供应链 #courses #agent-zero #cobalt #the-book-of-secret-knowledge #GitHub \ No newline at end of file diff --git a/podcast/2025-06-03.md b/podcast/2025-06-03.md new file mode 100644 index 0000000..12a7e98 --- /dev/null +++ b/podcast/2025-06-03.md @@ -0,0 +1,42 @@ +# 来生小酒馆 2025年6月3日 + +AI写的法律文书,您敢在法庭上用吗?用AI生成短视频,是不是意味着以后人人都是李安,还是人人都在制造数字垃圾?要是AI成了您全能的超级助理,包办一切,您的脑子会不会就此‘罢工’,享受提前退休了呢? + +嘿,亲爱的V,欢迎收听新一期的来生情报站,我是你们的老朋友,何夕2077。都说这AI啊,是科技圈的“顶流”,每天都有新花样,新动作,让人看着是既惊奇又有点儿摸不着头脑。今天啊,咱们就来扒一扒,最近AI又搞出了哪些新鲜事儿,看看它到底是要来帮我们过好日子,还是准备给我们找点儿‘麻烦’。 + +先说说这AI产品的更新吧。您瞧,谷歌最近在美国那边儿,把那Gemini Live功能推到iOS和iPadOS平台上了。这功能可有意思了,您可以通过Gemini App免费体验,它能帮你识别场景,还能看懂你屏幕上的内容。嗯,比如您在地铁里看小说,它可能都能给你分析个中心思想出来。这不就是咱们办公室里那种,特别会察言观色,什么都能替你想到,特别‘懂事儿’的同事嘛?就差没帮你泡咖啡了。这AI啊,真是一点点儿地,悄无声息地,钻进咱们生活里,成了个‘智能小管家’。 + +那微软呢,也不甘示弱,推出了个免费的Bing Video Creator工具。这可是基于OpenAI那个Sora技术啊。您别看这Sora之前多神秘,现在好了,您只要动动手指,敲几个字,就能变出个短视频来。这一下,拍电影的门槛是直接给它‘搬’没了。以前您想当导演,得有团队,得有设备,现在呢?一部手机,一个想法,‘咔嚓’,一个大作就出来了。不过话说回来啊,这要是以后人人都是导演,那咱们刷短视频,是不是得自带‘筛选器’了?不然啊,这信息过载,那可真是‘甜蜜的负担’。 + +再来聊聊AI前沿研究的那些‘大神们’。新加坡国立大学的团队,最近搞了个叫OmniConsistency的项目,了不起啊!它能用特低的成本,复现了GPT-4o那种高级别的图像风格一致性。您知道这意味着什么吗?以前可能只有‘大户’才玩得起的AI艺术创作,现在普通人也能玩出花来了。这就像是把高档餐厅的招牌菜,把秘方给‘解密’了,让大家在家都能做。这AI艺术,是越来越亲民了,但同时,‘稀有性’和‘原创性’的边界,是不是也变得有点儿模糊了呢? + +另外啊,您看,学术界也没闲着。什么WebChoreArena,专门测试大模型处理网页杂务的能力,发现GPT-4o虽强,但离真正‘包打听’还远着呢,还有巨大的提升空间。看来让AI帮你处理各种网站的繁琐操作,还不是那么容易。还有RoboMaster,研究怎么让机器人操作视频更逼真,解决了多目标互动中视觉保真度下降的问题。哎,这以后机器人真能像电影里那样,动作流畅,表情到位,那可真是……细思极恐啊,哈哈。 + +不过要说最近最‘热闹’,也最让人‘挠头’的,那还得是AI在社会上的‘折腾’。您听说没?美国犹他州有位律师,他啊,在法庭文件里引用了ChatGPT生成的虚假案例,结果被法院罚款了。这事儿一出来,那是引起轩然大波啊。咱们平时用AI查个资料,写个邮件,可能还挺方便的,可真要用到这种‘关键时刻’,比如法律文件啊,医疗诊断啊,这‘万一’要是出点儿岔子,那可就不是小事儿了。这事儿啊,就跟咱们办公室里,你让实习生去核对个重要数据,结果他复制粘贴错了,你还得再三核对一样,AI再智能,这‘审核责任’,咱自己可不能放松。这不就是提醒咱们,享受科技便利的同时,也得绷紧那根‘安全弦’嘛。 + +那OpenAI这边呢,他们也有个‘大计划’。据说啊,他们要在2025年上半年,把ChatGPT打造成一个具备‘T型技能’的‘超级助手’,要和苹果的Siri正面‘掰手腕’。他们想让ChatGPT不光能帮你查天气,还能帮你处理各种复杂任务。这听起来是不是有点儿像,未来每个人身边都跟着个无所不能的‘AI管家’?想想看,如果AI真的能做到这一点,那我们是不是就可以把很多琐事都丢给它了?这便利是便利了,可会不会有一天,咱们连自己泡杯咖啡都要问AI怎么泡了?这‘懒’的最高境界,可能就是AI帮我们‘懒’出来的吧。这既是福音,也可能带来一些深层次的思考,比如,我们的大脑,会不会因为过度依赖,而渐渐失去了某些能力呢?这,就得咱们自己去平衡了。 + +当然了,除了这些‘大新闻’,开源社区也没闲着。什么高性能的算法交易平台nautilus_trader啊,还有数据工程的综合性学习资源data-engineer-handbook啊,甚至连集成了AI功能的社交媒体日程安排工具postiz-app,都收获了大量的‘星星’。这说明啊,不管是专业人士,还是想学习新技能的朋友,或者只是想让生活更方便的,AI都在默默地贡献着自己的力量。 + +好了,今天的情报就到这里,注意隐蔽,赶紧撤离。 + +本期关键词: +#AI +#Gemini Live +#Bing Video Creator +#OpenAI Sora +#ChatGPT +#GPT-4o +#OmniConsistency +#WebChoreArena +#RoboMaster +#律师 +#虚假案例 +#超级助手 +#Siri +#开源 +#视频创作 +#图像风格化 +#机器人操作 +#审核责任 +#T型技能 \ No newline at end of file diff --git a/podcast/2025-06-04.md b/podcast/2025-06-04.md new file mode 100644 index 0000000..2b7eac8 --- /dev/null +++ b/podcast/2025-06-04.md @@ -0,0 +1,63 @@ +# 来生小酒馆 2025年6月4日 + +AI生成内容越来越方便,那传统创作者的路子是不是越走越窄了?AI能给我们看病,甚至有AI医生入驻,那以后生病了找AI还是找真人?还有啊,当AI聪明到能骗人,我们能用AI来防范AI的欺骗吗?这听起来是不是有点“以毒攻毒”? + +嘿,亲爱的V,欢迎收听新一期的来生情报站,我是你们的老朋友,何夕2077。 + +这几个问题,听着是不是有点意思?您瞧,最近这AI啊,真是把我们的生活搅得是“风生水起”。 + +您比如说,这动漫创作,以前您得学素描、学动画、学分镜,还得请团队,对吧?投入那叫一个大。现在好家伙,Komiko平台就搞了个“视频到视频”功能,您随便拍个小视频传上去,咔嚓一下,就给您变成动漫、漫画,各种艺术风格的动态内容。这是什么概念?咱老百姓,哪怕是您家隔壁王大妈,只要会拍视频,可能都能一键生成个“王妈宇宙”系列动画片了。它还提供AI线稿上色、动画补帧这些工具,目的就是让创意产业啊,实现个“数字化转型”。哎,看来以后动画片是真不缺了,就是不知道这专业人士的饭碗……嗯,您懂的。 + +说到这儿啊,语音编辑也跟着沾光。Play AI开源了个叫PlayDiffusion的工具,它能对音频片段进行“局部修改”,替换、删除、调整,厉害的是什么?它能做到“不留痕迹”,就跟没动过一样。这对于我们这种做播客的,那可是“天大的喜讯”啊!您想想,我这儿要是口误了,或者突然想把哪句话给换掉,以前得求着剪辑师一个字一个字地抠,现在呢?AI一键就给您搞定,还自然得跟您天生就这么说的似的。效率提高50倍,这效率啊,都快赶上我小时候抄作业的速度了。 + +不光短视频、音频,长视频也来啦!LumosFlow这个新框架,专门解决长视频生成里的“时间连贯性不足”和“过渡不自然”的问题。它能把生成视频的“运动和外观一致性”搞得特别好,最高能实现15倍的插值。就好像以前AI画画,可能画个头,下一个镜头脖子没了,再下一个镜头就长翅膀了。现在呢,它能把中间这些不自然的衔接都给填上,保证您看一部AI生成的电影,视觉上那叫一个丝滑。 + +你看,这内容创作的门槛是越来越低了,连RedditVideoMakerBot这种开源项目,都号称能用“一条命令”简化Reddit视频的创建过程。以后每个人都是导演、制片人、剪辑师、配音员,这可真是“人人都是自媒体”时代了。 + +但是啊,AI再厉害,它也是工具。咱们得聊聊这AI在医疗和安全方面的应用。 + +蚂蚁集团的“AI健康管家”,已经服务了超过4000万用户了,提供预约医生、健康评估、报告解读等智能健康服务。更了不起的是,它还成功通过了信通院医疗健康行业大模型的可信评估,成了首批获认可的产品。而且,60多位知名医生AI智能体也入驻了。这事儿听着多方便,您坐在家里,不用挂号排队,不用看医生脸色,AI给您把病给看了。可话说回来,生病了,到底是找AI还是找个活生生的大夫,这事儿,您心里肯定得掂量掂量,对吧?毕竟看病这事儿,除了技术,还有那么一点点“人情味儿”不是? + +更有点意思的是,AI“教父”约书亚・本吉奥,这位老先生,那可是AI界响当当的人物。他最近搞了个非营利组织叫LawZero,砸了3000万美元,要开发一个“科学家AI”系统,干嘛呢?专门防范未来AI智能体对人类进行“欺骗”。他说这系统将作为AI安全监控的“护栏”,要跟它监管的AI智能程度相当。这不就是AI版的“黑猫警长”吗?专门抓那些“坏”AI。但咱就想了,如果这“黑猫警长”自己也学会了“欺骗”,那可咋整?这事儿,就有点像郭德纲老师说的,“不是所有的牛奶都叫特仑苏”,也不是所有的AI都能保证它永远“乖乖的”。提高AI的透明性和可信性,这事儿确实重要,但道高一尺魔高一丈,这“魔”要是AI自己,可就真让人头疼了。 + +说到这“高魔”啊,OpenAI最近收购Windsurf这事儿,就让不少开发者心生不满了。本来用得好好的Claude模型,收购一完成,访问权限立马受限,成本增加,操作复杂,关键是,还用不上Claude4系列。这大厂收购小弟,本以为能强强联合,结果……哎,一言难尽。这事儿也说明了,科技巨头在市场上的动作,那可真是“牵一发而动全身”啊。 + +但咱们老百姓也有咱们的“智慧”。你看那个cursor-free-vip的开源项目,就专门针对Cursor AI的Pro功能,免费给用户升级,绕过高代币限制和试用请求。这不就是“你有张良计,我有过墙梯”嘛。 + +最后啊,科技博主大帅老猿就说了个挺接地气儿的事儿:现在很多人啊,把学来的知识重新讲述,然后录视频卖课,这本来没啥,但非要“标榜原创”,那可就有点“不地道”了。他说检验原创的唯一真理,就是“举报、投诉、打官司”,能让侵权内容下架,或者获得赔偿,你才有资格自称原创。这不就是告诉我们,这年头,AI都能给你生成文章了,你还敢说你写的都是原创?唯一的办法就是,拿证据说话,咱法庭上见!这事儿吧,也给那些想着“走捷径”的提了个醒,技术再发展,版权和原创性,那可是严肃的事儿。 + +总而言之呢,AI这玩意儿,它确实方便,确实能解决很多问题,能让我们的生活更有效率。但与此同时,它也给我们带来了一系列新的问题,比如信任、安全、原创性,还有这市场竞争的复杂性。未来,我们到底是让AI成为我们的“管家”,还是成为我们的“主人”,这选择权,可还得紧紧地攥在咱们自己手里啊。 + +今天的情报就到这里,注意隐蔽,赶紧撤离。 + +本期关键词: +#Komiko +#视频到视频 +#动漫 +#AI技术 +#蚂蚁集团 +#AI健康管家 +#可信评估 +#可靠性 +#约书亚・本吉奥 +#LawZero +#科学家AI +#欺骗 +#护栏 +#透明性 +#PlayDiffusion +#局部修改 +#音频 +#LumosFlow +#长视频生成 +#运动引导 +#OpenAI +#Windsurf +#Claude模型 +#RedditVideoMakerBot +#CursorAI +#cursor-free-vip +#大帅老猿 +#原创 +#举报 +#RAG架构 \ No newline at end of file diff --git a/podcast/2025-06-05.md b/podcast/2025-06-05.md new file mode 100644 index 0000000..6a5df0e --- /dev/null +++ b/podcast/2025-06-05.md @@ -0,0 +1,69 @@ +# 来生小酒馆 2025/6/5 + +哎,你说这AI现在都能写歌编曲了,甚至还能修修改改,那我们以后听的音乐,这版权到底算谁的? + +还有啊,咱们现在这些办公室的活儿,五年内是不是AI就都能替我们干了?那咱们到时候都去干嘛呢? + +最关键的是,AI这玩意儿,它究竟是仅仅提升我们效率的工具,还是说,它真的能像人一样,实打实地参与到社会公益里头,为我们带来更大的价值呢? + +嘿,亲爱的V,欢迎收听新一期的来生情报站,我是你们的老朋友,何夕2077。今天啊,咱们得好好聊聊最近这AI圈儿里又出了哪些“新鲜事儿”,别看都是些技术更新,里头可藏着不少咱们未来的“小秘密”呢。 + +先说说这个**Suno**吧。它最近给它那**AI音乐编辑工具**来了一次大升级,现在啊,用户能上传自己没完成的作品去混音,还能修改歌词,甚至能把曲子时长延长到八分钟!哎呦喂,这听着就像是给AI配了个金牌音乐制作人团队啊。但你看,人家唱片公司那边,可不乐意了,正跟它打**版权诉讼**呢,说要搞个**YouTube Content ID**那样的技术,追踪**AI**平台上音乐的使用情况。你瞧瞧,这AI想搞艺术,还真得先学学怎么“守规矩”,不然啊,这版权大棒可不认你是AI还是真人。 + +接着是**OpenAI**家的**ChatGPT**,这回又升级了新功能。现在它能直接连接**Outlook**、**Teams**、**Gmail**等好几个外部服务了,这目的嘛,就是提升企业用户的协作和信息获取效率。这可好,以后老板发个邮件,**ChatGPT**直接帮你总结,开个会,它直接给你生成会议记录和待办事项。特别是**macOS**版的**ChatGPT Team**用户,还新增了一个“**录制模式**”。你说说,这不就是你的“贴身秘书”加“会议监听员”吗?省事儿是省事儿,但你想想,以后是不是连开会打瞌睡都没机会了?哈哈。 + +再看这个**AI**驱动的代码编辑器**Cursor**,它也正式发布了1.0版本。里头啊,有个核心功能叫**BugBot**,能自动化审查**GitHub**上的**Pull Request**,还能一键修复代码。这**AI**啊,都开始帮程序员“写作业”、“改错”了,而且还增加了**Jupyter**支持和“Memories”项目管理功能。这程序员的福音啊,以后是不是天天都能准点下班了?我看悬! + +当然了,**AI**不光能赚钱、能打工,现在还能做公益了。**腾讯公益**最近就推出了一个创新性的“**问 AI**”功能,这可是首次把**大型人工智能模型**应用到公益领域。这不就是告诉大家,**AI**也能有“大爱”嘛。挺好的,让公众更方便了解公益项目,参与公益事业。 + +说到前沿研究,有个叫**SuperWriter-Agent**的框架,这玩意儿厉害了,它通过引入结构化的思考、规划和完善阶段,让**大型语言模型**在生成长文本的时候,连贯性和质量都大大提升。听着是不是有点像,这**AI**写东西,现在可不是“胡说八道”了,也开始讲究“章法”,像个专业作家一样了。以后咱们是不是人人都能出本书了? + +说到这儿,**OpenAI**的首席执行官**山姆・奥尔特曼**就说了,现在企业啊,开始把**AI**当成基层的员工来用了。你猜怎么着?去年到今年,科技公司初级岗位的招聘量直接就下降了25%!哎,你说这可不是闹着玩儿的。专家预测,到2030年,可能3.75亿个**工作岗位**都要被**AI**取代,甚至未来一到五年内,咱们白领里头,可能就有一半初级岗位要被“优化”掉,失业率可能要飙到20%!这听着是有点儿“扎心”啊,但反过来想想,这不也催着咱们得赶紧“升级”自己嘛,对吧?不然真就得跟这**AI**“抢饭碗”了。 + +咱们再看看几个开源项目,这**HowToCook**啊,是专门为程序员设计的居家烹饪指南。这下可好,程序员不光能写代码,还能做饭了,这才是真正的“斜杠青年”!还有**system-design-primer**,那是学习如何设计大规模系统,准备系统设计面试的“武功秘籍”。更有意思的是**ChinaTextbook**,致力于收集中国所有中小学及大学的**PDF教材**,这真是功德无量啊。最后这个**Firecrawl**,它推出了个突破性的**/search API**,让开发者通过一次调用就能实现网页搜索和内容抓取,而且是以**AI友好**的格式输出,这大大简化了**AI**应用的数据获取流程。 + +最后啊,看看社媒上大伙儿都聊些啥。**Gorden Sun**分享了一套能生成“超级赞”图文效果的**AI提示词**,他还推荐大家用**GPT4o**、**Claude-3.7**和**DeepSeek-V3**这些工具。原来**AI**画图写文,还得靠“咒语”啊,有意思。还有位推主**wwwyesterday**,把现代**学术论文**比作**npm**包管理系统,他说两者都存在论文数量庞大、引用层层叠叠的现象,而且大部分价值不高,少数才是经典。这哥们儿真会玩儿,这不就是说,知识的海洋里,也有不少“垃圾信息”嘛?但他说,自己还是会刷**arxiv**寻找新观点,这叫“在垃圾堆里找金子”,挺有哲理的。 + +行了,今天的情报就到这里,注意隐蔽,赶紧撤离。 + +--- +本期关键词: +#AI音乐编辑工具 +#Suno +#版权诉讼 +#YouTube Content ID +#ChatGPT +#Outlook +#Teams +#Gmail +#macOS +#录制模式 +#BugBot +#Cursor +#Pull Request +#Jupyter +#Memories +#腾讯公益 +#问 AI +#大型人工智能模型 +#SuperWriter-Agent +#大型语言模型 +#山姆・奥尔特曼 +#AI +#工作岗位 +#失业率 +#HowToCook +#system-design-primer +#ChinaTextbook +#Firecrawl +#/search API +#GitHub +#Gorden Sun +#AI提示词 +#GPT4o +#Claude-3.7 +#DeepSeek-V3 +#wwwyesterday +#学术论文 +#npm +#arxiv \ No newline at end of file diff --git a/podcast/2025-06-06.md b/podcast/2025-06-06.md new file mode 100644 index 0000000..49ed86a --- /dev/null +++ b/podcast/2025-06-06.md @@ -0,0 +1,128 @@ +# 来生小酒馆 2025/6/6 + +AI生成视频技术越来越强,是不是意味着人人都能成为“李安”?那专业的导演和制作团队,以后是不是都得“失业”了? +全球AI格局正在重塑,中国AI和开源浪潮全面崛起,这到底是AI行业“内卷”加剧的前奏,还是我们普通人弯道超车、抓住新机遇的绝佳时机? + +嘿,亲爱的V,欢迎收听新一期的来生情报站,我是你们的老朋友,何夕2077。最近啊,这人工智能的动静是越来越大,感觉就像是哪吒闹海,一浪高过一浪,咱们普通人,真是有点儿眼花缭乱,也有些忐忑,这未来的饭碗,它还能不能端稳咯? + +您瞧着,这不,最近有个叫Pollo AI的,直接给咱甩出来一个一站式的AI图像和视频生成平台。它把全球那些顶尖的模型,像什么Google Veo 3、Kling啊,都给整合进去了。您就动动嘴皮子,或者敲几行字,它就能给您把视频、图像给变出来,还能保持角色风格一致。以前拍个片子,那得请导演、摄影、后期,花老鼻子钱了。现在可好,AI一出手,您输入几行字,视频就出来了。这不就是把咱们这创意人的头发丝儿,都给省下来了嘛!而且,它成本还低,这是准备让大伙儿都过把导演瘾啊! + +说起来,Luma Labs也发布了个新工具,叫Modify Video,那是基于他们那个Dream Machine平台,用上了Ray2模型。这个更绝,您想改视频里的风格?想换个场景?想调整人物的表情动作?直接文字提示就行。以前剪个片子得掉多少头发啊,现在可好,动动手指头,它就给您变了。这不就等于给咱们这视频制作,直接按了个快进键嘛! + +您说这AI,是不是越来越像个“磨人的小妖精”?它不光能听懂你说话,还能用各种语调、情感跟你聊天。这不,谷歌的Gemini 2.5版本一更新,据说它能原生理解和生成文本、图像、音频、视频和代码,成了个真正的多模态AI系统。以后跟AI对话啊,那感觉就像跟真人聊天一样,它还能控制语音输出的语调和情感。以后再跟AI吵架,它是不是能比你还委屈,给你演一出“窦娥冤”啊? + +不止是工作,连游戏里都开始玩AI了。咱热门手游《逆水寒》啊,跟可灵AI合作,搞了个“图生动图”的玩法。您在游戏里截个图,或者上传张图片,再输入几句描述,立马就能变成个性化的动态画面,还能双人互动创作呢!以前咱玩游戏,能炫耀个装备就不错了,现在能炫耀自己做的AI动图,这不就是艺术家下凡嘛! + +当然了,别看这些应用花里胡哨,背后可都是硬核科技在支撑。NVIDIA最近又发布了个大模型,叫Llama-3.1-Nemotron-Nano-VL-8B-V1,它是个视觉语言模型,能看图、看视频、写文字,而且据说在单张RTX GPU上就能跑!这意思是,咱家里那块打游戏的显卡,说不定以后也能跑个AI大模型了。还有个叫Voyager的视频扩散框架,能从一张图生成3D点云序列,这是要给游戏和虚拟现实里的3D场景,直接搞个“乾坤大挪移”啊! + +说到这儿,就不得不提硅谷那边的风向标,一位叫Mary Meeker的投资大佬,最近发布了个AI报告。您听听这报告里怎么说的:以前是OpenAI一家独大,现在呢?中国AI和开源模型可不是吃素的,都开始“抢地盘”了!这哪儿是竞争,分明就是一场“AI版三国演义”嘛!而且她还提到,中国AI模型性能已经逼近国际一线,在制造业那真是“杠杠的”。开源模型呢,因为便宜灵活,市场份额蹭蹭往上涨。这说明什么?AI行业啊,已经进入了一个多极对抗的新时代了。咱普通人,这饭碗是更稳了,还是得跟着AI再学两招呢? + +当然了,别看AI搞得这么高大上,其实也有很多接地气的开源项目。比如netbird,它能帮助您把各种设备连接到安全的覆盖网络,就像给数据修了个高铁专线,安全高效。还有quarkdown,那可是Markdown文本的“超能力”赋予者,您写的笔记啊,几下子就能变成演示文稿、文章、书,省心啊。甚至有项目比如cognee,它厉害了,据说只用5行代码就能实现AI智能体的记忆,这不就是给AI装了个“小脑袋”嘛,大大降低了开发的门槛。 + +对了,说到AI的记忆,最近网上有个段子,特别火,说是跟AI聊天,您就让它每次都叫您“哥哥”,多叫几次。啥时候它不叫了,那恭喜您,可以开新窗口了,因为它“失忆”了!您说这小技巧,是不是把AI拿捏得死死的?最后再提个小福利,Fish Audio最近也开源了他们的S1-mini语音模型,个人免费部署使用,您想体验AI语音合成,现在成本几乎为零了。 + +今天的情报就到这里,注意隐蔽,赶紧撤离。 + +本期关键词: +#Pollo AI +#AI图像与视频生成平台 +#Google Veo 3 +#Kling +#文字转视频 +#图像风格化 +#角色一致性 +#API接入 +#Google Cloud +#Veo 3模型授权 +#Luma Labs +#AI视频编辑工具 +#Modify Video +#Dream Machine平台 +#Ray2模型 +#文本提示 +#风格重塑 +#场景替换 +#角色调整 +#动作流畅性 +#时间一致性 +#谷歌 +#Gemini 2.5版本 +#AI音频对话与生成技术 +#多模态AI系统 +#实时音频对话 +#风格控制 +#多语言 +#文本转语音 +#语调 +#情感 +#逆水寒 +#可灵AI +#图生动图 +#玩家 +#动态画面 +#双人互动创作 +#NVIDIA +#Llama-3.1-Nemotron-Nano-VL-8B-V1 +#8B参数视觉语言模型 +#图像 +#视频 +#文本输入 +#高质量文本 +#图像推理能力 +#OCR +#文档智能 +#AWQ4bit量化技术 +#RTX GPU +#Hugging Face +#开源 +#多模态AI解决方案 +#Voyager +#视频扩散框架 +#单张图片 +#摄像机路径 +#世界一致的3D点云序列 +#游戏 +#虚拟现实 +#3D场景 +#RGB +#深度视频序列 +#帧间固有 +#3D一致性 +#视觉质量 +#几何精度 +#Mary Meeker +#AI报告 +#全球AI竞争格局 +#中国AI力量 +#开源浪潮 +#OpenAI +#头部公司 +#制造业 +#产业融合能力 +#开源模型 +#市场份额 +#多极对抗新时代 +#netbird +#WireGuard® +#安全的覆盖网络 +#SSO +#MFA +#访问控制 +#quarkdown +#Markdown +#演示文稿 +#文章 +#书籍 +#cognee +#5 行代码 +#AI 智能体的记忆 +#AI 对话 +#AI的记忆机制 +#新开对话窗口 +#Gorden Sun +#Fish Audio +#S1-mini语音模型 +#S1模型 +#0.5B参数 +#个人免费部署使用 +#不可商用 diff --git a/podcast/2025-06-07.md b/podcast/2025-06-07.md new file mode 100644 index 0000000..e46c021 --- /dev/null +++ b/podcast/2025-06-07.md @@ -0,0 +1,56 @@ +# 来生小酒馆 2025/6/7 + +咱们的汽车以后是开着还是聊着?未来我们的车机系统,真的会比你老婆还懂你吗?当AI连语音、视频都能“演技合成”的时候,那些靠创意吃饭的艺术家们,是不是真要“失业”了?还有,当越来越多的大佬都开始转行搞AI的时候,这究竟是新的淘金热,还是“全民皆兵”的内卷开端呢? + +嘿,亲爱的V,欢迎收听新一期的来生情报站,我是你们的老朋友,何夕2077。诶,你看,今天这些问题啊,可真有点意思。人工智能这阵风啊,真是越刮越猛,而且是吹到哪儿,哪儿就变样。 + +先说这个汽车圈吧。你知道吗,德国的科技巨头博世,最近就跟咱们的阿里云联手了,他们要把通义大模型给搬到智能座舱里头去。这是要干嘛呢?就是让你的车机系统啊,能跟一个3D数字人互动。以后你在车里,不光能问它路况、天气,还能让它给你当同声传译!想想啊,你一上车,数字人小姐姐或者小哥哥就热情地问你:“老板,今天心情如何?要不要来段轻松的爵士乐?”然后,你再问个专业问题,它也能对答如流。这哪是开车啊,这简直是开个移动的“智能生活空间”,以后上车都不想下去了,你说对吧?这一下子,车的定位就从交通工具,变成了你的智能生活助理了。 + +再来看看我们平时工作效率这块儿。以前看那些上市公司的财务文件啊,什么SEC文件,那简直是比天书还难懂,密密麻麻的数字,生僻的词儿,看着就头大。但现在,Perplexity AI出了个新功能,专门帮你搞定这些。它能让你轻松查询、理解复杂的财务文档,而且,人家给的答案,还都附带引用,有理有据。这下好了,咱们普通投资者也能“读懂”财报了,是不是感觉离“股神”又近了一步?而且啊,它还有一个“实验室”功能,你随便输点提示,它就能给你生成一份完整的报告、仪表盘什么的,哎呀,这工作流效率,那真是蹭蹭地往上涨啊! + +还有啊,程序员朋友们注意了!Trae平台最近升级,直接集成了谷歌的Gemini 2.5 Pro Preview模型。这模型厉害在哪儿呢?它在Web开发和编码排行榜上,都是排第一的。这意味着什么?就是说,它能显著提升你的前端开发和UI设计能力。什么代码转换啊,编辑啊,复杂的工作流啊,统统给你优化了。更关键的是,它现在免费向用户开放了。这下可好,咱们在区块链和去中心化应用领域的创新,说不定就能迎来一个大爆发。 + +说到创意和内容生成,这年头AI真是无孔不入。海外那个知名的AI视频生成平台PixVerse,它出了个国内版,叫“拍我AI”。移动端App和网页版都上线了。这玩意儿干嘛的?就是让你通过一段文字,或者一张图片,就能一键生成高质量、多风格的视频!你说这多方便啊,你发个朋友圈小视频,电商做个产品介绍,小红书弄个封面,分分钟搞定。它可不是简单的拼贴,它用了PixVerse V4.5算法,还做了本地化优化,我看啊,以后人人都能当导演了。 + +更绝的是,ElevenLabs,这家公司发布了一个新的文本转语音模型,叫Eleven v3 Alpha版。他们自己都说了,这可能是“地表最强”的文本转语音技术。它不光能把文字转化成自然流畅的语音,还能通过音频标签,精准控制情感、语速,甚至还能加入音效!说白了,就是能实现“演技合成”。你看,电影配音,虚拟助手,这下可都要变天了。以前我们听AI语音,总觉得有点僵硬,现在倒好,它能跟你“飙戏”了! + +当然了,这些AI技术的发展,也离不开幕后的那些前沿研究。比如最近就有个叫“动态内存稀疏化”的新方法,它能让大型语言模型在推理的时候,更省资源,更准确。这就像是给AI的大脑做了个“瘦身提效”手术,让它在同样条件下,能想得更多,想得更清楚。 + +说到AI的落地,宇树科技的CEO王兴兴,最近就说了句大实话。他说他们公司搞机器人的终极目标,可不是为了让机器人在那儿跳舞、格斗耍酷,那些都只是训练和技术验证的手段。他们的目标是让机器人真正能在家用场景、工业场景里头,实打实地干活儿。他还透露,今年上半年,人形机器人在商业租赁市场,就已经开始赚钱了,这就说明,机器人实用化,那是指日可待啊!以后说不定咱们家里,真能有个机器人帮你做饭、打扫卫生了,当然,前提是它别把你家给拆了啊,哈哈。 + +还有一位大家都很熟悉的王自如老师,最近也“复出”了,不过他把B站的账号改成了“王自如AI”。他说要以AI测评UP主的身份,开启他的“二次创业”,专门做AI内容和AI应用。从测评手机到测评AI,这跨度,不服不行啊。他也感谢了董明珠和雷军的支持,看来AI这块儿,真是吸引力十足,连大佬们都坐不住了。 + +当然啦,除了这些大厂和牛人,还有很多开源项目也在默默地推动AI的发展。比如有个叫note-gen的,能帮你把零散的知识,用AI整理成好读的笔记;还有notebooks项目,能让你免费微调大型语言模型。这些啊,都是在背后给AI添砖加瓦的。 + +最后,再跟大家分享个有意思的观点。有位叫Yangyi的博主,他提出了一个AI产品价值公式,说AI产品的价值,其实就是“新体验”和“迁移成本”之间的差值。说白了,就是你的AI产品得让人用起来感觉特别爽,效果超出预期,界面也得漂亮;同时呢,还得让人家从老平台过来,没什么门槛,数据也能轻松迁移。你看,这一下子就把AI产品做好的“秘诀”给点透了。 + +好啦,今天的情报就到这里,注意隐蔽,赶紧撤离。 + +本期关键词: +#AI +#智能座舱 +#数字人 +#博世 +#阿里云 +#Perplexity +#财务文档 +#Trae +#Gemini +#前端开发 +#UI设计 +#PixVerse +#拍我AI +#视频生成 +#ElevenLabs +#文本转语音 +#机器人 +#实用化 +#王自如 +#AI测评 +#即梦AI +#智能参考 +#AI产品 +#价值公式 +#LLM +#Transformer +#动态内存稀疏化 \ No newline at end of file diff --git a/podcast/2025-06-08.md b/podcast/2025-06-08.md new file mode 100644 index 0000000..fb48c09 --- /dev/null +++ b/podcast/2025-06-08.md @@ -0,0 +1,50 @@ +# 来生小酒馆 2025/6/8 + +阿里最新的AI模型,性能居然超越了谷歌和OpenAI的顶尖产品,这让我们不禁要问,这AI的速度是不是有点太快了,人类的“看家本领”还能守多久? + +当AI不仅能帮你写作文,还能化身“虚拟专家”手把手教你沟通技巧和领导力,那未来的学习和成长,是不是真的可以告别真人导师了? + +从能感知世界的“世界模型”,到能与脑科学结合的“具身智能”,这些高精尖的AI研究,究竟会把我们带向一个更智能的乌托邦,还是一个充满了未知挑战的未来? + +嘿,亲爱的V,欢迎收听新一期的来生情报站,我是你们的老朋友,何夕2077。今天这期节目啊,咱们得聊聊这几天AI圈里又出了哪些“新鲜事儿”。你说这AI啊,一天一个样,搞得咱们这些老铁们都得小跑儿着追。 + +哎,话说回来,前两天,阿里巴巴可是亮出了他们的“肌肉”!推出了一个叫**千问3向量模型**系列,名字听着就挺酷炫的,叫Qwen3-Embedding。这不光是名字响亮,人家这性能啊,在文本检索、聚类、分类这些任务上,一口气提升了超过四成!您品,您细品,这是什么概念?这就好比,你本来是个百米选手,突然就跑进了八秒!更让人“哇塞”的是,它在同类模型里,居然还拿到了**最佳性能**,就是SOTA,一下子就超越了谷歌和OpenAI那些顶尖模型。哎呀,咱们中国AI,这势头起来了,你说是不是?而且,这回他们挺敞亮,直接开源了九款模型,还提供了API服务,全球的开发者都能用上,这不就是“独乐乐不如众乐乐”嘛! + +再看那边,搞视频剪辑的朋友们,你们的“春天”可能真的来了!一个叫**Diffusion Studio Pro**的AI视频编辑工具正式亮相。人家直接把这玩意儿比作“CapCut + Cursor”的结合体,听着就高端。本地优先,浏览器里就能搞定,里头集成了十几种生成式AI模型,那意思就是,你动动嘴,AI帮你把视频剪好,把门槛降得那是真低。以前剪个片子得熬秃头,现在呢,AI来帮你磨皮、上色、加特效,你只管把想法说出来,它给你变出来。简直是把导演梦送到你嘴边,这以后,是不是人人都是“张艺谋”了? + +说到这儿,谷歌也没闲着,他们推出了一个很有意思的AI产品,叫**Portraits**。这个是干嘛的呢?您是不是经常觉得跟领导汇报工作时,话到嘴边就打结?跟同事沟通,总觉得不在一个频道?嘿,谷歌给你请了个AI老师,还是畅销书作家同款的!你可以跟这个虚拟专家实时对话,学习个性化的沟通技巧和领导力。这AI都开始教咱们“情商”了,这以后,情商低可就不是借口了,是你不努力跟AI老师学啊!当然啦,目前这个服务呢,只对美国用户开放测试,咱们想体验还得等等。但这趋势已经很明显了,**AI教育**,它要往更互动、更个性化的方向去了。 + +还有啊,咱们国内的智源研究院,那也是“憋了个大招”。在最近的北京智源大会上,他们一口气推出了一系列叫做“悟界”的**大模型**。您听这名字,什么“原生多模态世界模型Emu3”,还有跟脑科学结合的“见微Brainμ”,甚至还有搞具身智能的“RoboOS”和“RoboBrain”。这可不是让你看个热闹,人家这是奔着解决人类大问题去的,什么医疗啊、教育啊、环境监测啊,都要用AI来推动。你说这AI都开始有了“世界观”,还能结合脑科学,以后是不是真能跟科幻电影里一样,有能“思考”的机器人了?想起来就有点,嗯,小激动。 + +在社交媒体上呢,也有一些有意思的发现。有位高手啊,刘勿锋,他分享了一个用**Claude**画图的小技巧。你知道吗,他能通过简单的提示词,让Claude调用像iconfont、Lucied React这些第三方的图标库,而不是用系统自带的emoji。你看,高手就是高手,你还在那让AI给你生成大胖小子,人家都开始调教AI怎么用图标库了,这一下子,前端网页的视觉效果和风格统一性就上去了,细节决定成败嘛! + +还有一位叫wwwgoubuli的朋友,他预估啊,接下来社交媒体上会出现两种热门内容:一部分是深入分析**作文题目**的讨论,另一部分则是围绕**AI写作文**展开的创作比拼。这意思就是,高考作文一出,大家可能都在好奇AI能写出啥样,然后可能还会有人晒出AI写的“满分作文”来“凡尔赛”一下。那画面,想想都觉得挺有意思,也挺“内卷”的,哈哈! + +你看,今天这几条情报,是不是也挺发人深省的?AI的进步真是太快了,从文本模型到视频编辑,从教育培训到前沿科研,甚至连我们日常的社交媒体讨论,都离不开它了。未来已来,咱们可得好好适应这变化呀。 + +今天的情报就到这里,注意隐蔽,赶紧撤离。 + +本期关键词: +#AI +#模型 +#开源 +#性能 +#千问3向量模型 +#Qwen3-Embedding +#Diffusion Studio Pro +#视频编辑 +#生成式AI +#Portraits +#谷歌 +#虚拟专家 +#沟通技巧 +#领导力 +#AI教育 +#大模型 +#智源研究院 +#多模态 +#具身智能 +#开发者 +#创作 +#Claude +#作文 \ No newline at end of file diff --git a/podcast/2025-06-09.md b/podcast/2025-06-09.md new file mode 100644 index 0000000..da6c6c1 --- /dev/null +++ b/podcast/2025-06-09.md @@ -0,0 +1,58 @@ +# 来生小酒馆 2025/6/9 + +AI越来越像人,我们会不会分不清谁是真人谁是AI?AI数字人即将成为电商标配,那我们以后是不是都得和真人客服说拜拜了?还有,AI说的话到底能不能信,它会不会一本正经地胡说八道,我们又该如何辨别呢? + +嘿,亲爱的V,欢迎收听新一期的来生情报站,我是你们的老朋友,何夕2077。最近啊,这人工智能的动静是越来越大,感觉就像它在你家隔壁买了个房,准备随时搬进来跟你做邻居。今天咱们就来聊聊,这AI最近又整出了哪些新鲜玩意儿,以及它们可能给咱们的生活带来哪些“小惊喜”或者“小惊吓”。 + +这不,OpenAI最近又给它的ChatGPT高级语音功能升了个级。以前吧,你跟AI聊天,总觉得有点儿像跟一个“棒读”播音员对话,感情不够真挚。现在可好,人家OpenAI说了,ChatGPT的语调更自然了,节奏更真实了,情绪表达也更丰富了。这意思就是,以后你跟AI打电话,可能听着比你对象都像个人!你知道吧?它还加了个双向自动翻译功能,就是你一句我一句,不用老是按着说话键,对话就能一直翻译下去。这功能,你说厉害不厉害?以后出门旅游、远程办公,甚至学外语,都省心了。不过话说回来,以后AI要是太“像人”了,你跟我打电话,我说了句不着调的,你可别以为我是AI在搞鬼啊! + +除了聊天,咱们国产的AI也不甘示弱。面壁智能前两天就发布了MiniCPM 4.0系列模型,厉害在哪儿呢?它把AI模型做得特别小巧,能塞进你的手机或者其他小设备里头。最牛的是,速度快到飞起,极限情况下能提升220倍!你看,这简直是给你的小破手机安了个火箭助推器啊,让你平时刷个短视频、点个外卖都感觉丝滑无比。 + +当然了,AI可不是光顾着跟咱们聊天、跑得快。在幕后,也有不少“扫地僧”在默默耕耘。比如有个叫tensorzero的项目,它就像个“AI教导主任”,专门给AI学习过程搞了个“反馈循环”。说白了,就是把咱们平时用的数据,变成AI的“学习资料”,让AI越来越聪明,越来越懂你,而且还越来越省钱。这不就是咱们打工人梦寐以求的吗?用自己的数据喂自己的AI,让它越来越懂你,也越来越省钱,这不就是咱们打工人梦寐以求的吗? + +还有个特有意思的项目,叫HumanSystemOptimization,它的目标是——“健康学习到150岁”!哎呦喂,这哪是学习指南啊,这简直是修炼秘籍,教你怎么把自己的身体系统调优到极致。你看,现在连GitHub上的开源项目都开始教人“长生不老”了,你说这科技发展是不是有点儿“跑偏”了? + +不过,回归正经的,像omni-tools这种自托管的网页工具集,它就强调“无广告、无跟踪”,而且在浏览器里就能用,快速又便捷。这不就是咱们想要的“私人定制”工具嘛,就像自己家后院搭了个工具棚,想用啥工具,直接拿,没人偷窥你,多踏实。 + +说到这里,咱们不得不提一提现在大火的AI数字人。你看,好多电商平台已经开始用AI数字人做主播了。黄赟就说,AI数字人将成为电商的标配。你想想,以后你打开直播间,看到的可能都是一个完美的数字人,一天24小时不打烊,而且永远不会“翻白眼”。但是啊,这里面也有个小插曲,前段时间就听说有AI主播被“开发者模式”给玩坏了,一不小心说了不该说的,那技术服务商可不就得赶紧打补丁嘛!这就提醒咱们,AI再厉害,也得有人类在后面把关,不然可就成了“脱缰的野马”了。 + +还有个挺有意思的现象,Google最近就劝开发者,说别自己瞎捣鼓了,你看人家Google都把饭做好了,直接用我们高质量的深度研究代码库,它比你那“凭感觉写代码”的版本强多了。这意思就是,别老想着自己造轮子,人家的轮子又圆又稳,直接拿来用多好! + +但话说回来,这AI再厉害,也有它的“小脾气”,也有它搞不定的时候。比如,咱们杨总(Yangyi)就呼吁开发“睿智的AI”,说白了,就是能一眼看出它自己是不是在“胡说八道”,识别幻觉和虚假信息。你看,这AI也会胡说八道啊,那咱们人类可得小心了。这就像给AI请了个纪检委,专门抓它说谎,这主意听着就靠谱。 + +最后咱们聊聊一个挺现实的问题。你猜怎么着?有公司用ChatGPT替代客服,结果翻车了!文章里说啊,用户还是更倾向于和真人客服沟通,甚至因为AI客服不好用,都考虑换竞争对手了。你看,人啊,有时候就喜欢那点人情味儿。AI再聪明、再高效,也替代不了人类情感交流带来的那份温暖。这不就跟咱听相声一个道理吗,AI讲得再好,也少点儿郭德纲的味儿,对吧?所以说到底,科技发展得再快,也别忘了,咱们服务的对象是人,人情味儿,那可是永远的刚需啊! + +今天的情报就到这里,注意隐蔽,赶紧撤离。 + +本期关键词: +#ChatGPT +#语音功能 +#面壁智能 +#MiniCPM +#端侧 +#tensorzero +#LLM +#反馈循环 +#HumanSystemOptimization +#人体系统调优 +#omni-tools +#网页工具集 +#BlackFriday-GPTs-Prompts +#免费GPTs +#RAG +#语义分块 +#上下文增强检索 +#AI数字人 +#电商平台 +#AI主播 +#FLUXkontext +#汽车宣传图 +#Google +#深度研究代码库 +#睿智的AI +#幻觉 +#虚假信息 +#AI幻觉专家网络 +#ChatGPT替代客服 +#真人客服 +#用户体验 \ No newline at end of file diff --git a/podcast/2025-06-10.md b/podcast/2025-06-10.md new file mode 100644 index 0000000..a279b07 --- /dev/null +++ b/podcast/2025-06-10.md @@ -0,0 +1,45 @@ +# 来生小酒馆 2025/6/10 + +未来高质量的AI服务,是不是都要变成我们钱包里的‘硬通货’,免费午餐真的要吃完了吗?AI是越‘大’越好,还是‘小而精’、‘专而深’更能出奇制胜?我们是不是对AI的认知,还停留在‘越大越智能’的误区里?还有啊,在AI这条路上,究竟是闭门造车的‘独门秘籍’更胜一筹,还是‘集思广益’的开源生态才能走得更远?而当我们看到AI编程都开始遇到瓶颈,那下一个颠覆性的‘奇点’又会在哪里呢? + +嘿,亲爱的V,欢迎收听新一期的来生情报站,我是你们的老朋友,何夕2077。哎呀,最近这AI圈子里啊,可真是热闹得不行,信息量大到我都觉得脑细胞有点不够用了。但是呢,咱们情报站的宗旨就是化繁为简,用最轻松的方式,给您把这最前沿的科技八卦,啊不,科技新闻,给您说道说道。您甭管您是坐在格子间里写代码的,还是在茶水间里摸鱼的,都得听听,这未来啊,可能就藏在这些小小的变化里头呢。 + +首先啊,咱们得说说谷歌这老大哥。你说这以前吧,‘免费’俩字儿,在互联网时代那可是个香饽饽,尤其是在AI这块儿。结果最近呢,谷歌AI Studio说变脸就变脸,从5月开始,它那个Gemini 2.5 Pro,就是那个特别厉害的模型,免费用户啊,您就别想随便用了。想用?得自己掏API密钥,说白了,就是得花钱了。你说这事儿闹的,是不是就像咱们食堂突然宣布,以前免费的汤,现在要收费了?大家伙儿都在议论啊,这恐怕是谷歌在推动Gemini商业化,要把高性能模型往付费体系里头塞的信号。嗯,看来这年头,连AI也得‘内卷’,免费的终究还是最贵的,这‘羊毛出在羊身上’的道理,AI也不例外啊。 + +但是呢,有人关门,就有人敞开怀抱。咱们国产大模型这边啊,阿里旗下的通义千问3,那可真是扬眉吐气了一回。你知道吗?它开源才一个月,全球下载量就突破了1250万次,在Hugging Face这些国际大平台上,衍生出来的模型那叫一个多啊,超过13万个,直接就跃居全球第一了!哎呀,这可真是‘人逢喜事精神爽’,这说明什么?说明咱们中国的大模型,在开源这块儿,那可是实打实地跟国际水平接轨了,甚至在某些方面,还得领先一步。这阿里啊,在全球AI基础模型生态里头,那是妥妥地站稳了脚跟,有牌面! + +说到模型啊,这不,最近又杀出了一匹黑马,叫MonkeyOCR。一听这名字就透着股灵气,猴子识别呗。这哥们儿可不得了,它是个轻量级的文档解析模型,参数才3B,才3个B啊!结果呢,在英文文档解析这任务上,它直接就把Gemini 2.5 Pro这些‘大块头’给超了,而且处理速度还快了一大截。你说这是不是有点像,一个练轻功的小师傅,一招‘四两拨千斤’,把那些膀大腰圆的壮汉都给撂倒了?它的秘诀啊,就是一套‘结构-识别-关系’的三元组范式。这不仅仅是提高了准确率,关键是大大降低了对计算资源的需求,也就是说,咱们中小企业啊,以后想用AI来处理文档,那成本可就下来了,这不就得了嘛!可别小看这些‘小而美’的AI,有时候啊,它们才是真正解决咱们实际问题的‘行家’。 + +有意思的是啊,前一阵子,字节的‘豆包’和腾讯的‘元宝’,这俩AI,去挑战了2025年高考新课标的数学卷。结果呢,都考了68分,并列第一。哎呀,你说这AI现在都开始考高考了,以后我们孩子是不是直接让AI替考就行了?(开玩笑啊,千万别当真!)这分数啊,虽然不能说逆天,但也充分展现了它们在复杂推理上的潜力。这说明啊,AI在细节处理、公式应用和逻辑推理上,确实进步不小。 + +但是呢,您可别光顾着看AI的‘高光时刻’,有时候啊,它也会‘翻车’。前几天有个架构师叫罗伯特·卡鲁索,他就做了一个特别有意思的实验,拿1977年的老古董Atari 2600游戏机上的国际象棋引擎,去跟OpenAI的ChatGPT下棋。结果您猜怎么着?这ChatGPT啊,居然输了!它下棋的时候,那是频繁犯错,甚至连棋子都混淆。这可真是‘新AI不如旧AI’。这事儿就给咱们提了个醒儿,AI虽厉害,但它也不是万能的,每个AI都有自己擅长的领域,别拿它的短板去比人家的长板,那不是自讨没趣嘛。 + +话说回来,咱们再聊聊AI编程代理。有位博主叫wwwgoubuli,他就说啊,AI编程代理现在有点进入平台期了。虽然像Gemini 2.5 Pro和Claude这些模型还是很强,但他觉得模型本身再有‘飞升’的空间有限了。他预测啊,未来会是更多产品井喷式发展,重点呢,在于‘载体’、‘媒介’和像IDE/plugin这些方面的完善,而不是核心模型能力的突破。这AI啊,就像咱们打工人,有时也得‘停下来喘口气’,想想下一步该往哪儿走。这说明啊,AI的发展,不仅仅是算法的进步,更是工程化的落地,还有咱们如何把这些‘超能力’,真正地融入到日常的工作生活里头。 + +哎,说到这融入日常啊,最近还有两个特别实用的小发明。一个呢,是Tw93推荐的PayQrcode方案。你知道以前咱们线下付款,微信支付宝得扫俩码,多麻烦啊。这哥们儿就厉害了,他用‘物理图片合并技术’,把微信和支付宝的收款码合到一张图上去了!而且啊,离线场景下也能识别,识别效果还挺好。你说这不就是妥妥的‘懒人福音’吗?还有呢,就是博主归藏介绍的,在Liblib平台在线使用FLUX Kontext工具修改图片。以前用Comfyui得在本地跑,特别吃资源。现在呢,人家直接给你搬到线上了,什么单图、双图、三图融合,图片放大,都给你整明白了。这不就是把复杂的专业工具,变成人人都能用的‘傻瓜式’操作了吗?这AI啊,有时候就得这样,把高深的玩意儿,变得接地气,变得人人都能玩转,这才能真正改变咱们的生活。 + +你看啊,从谷歌的‘收费’到阿里的‘开源’,从‘大模型’到‘小而精’,再到AI考高考、AI下象棋,还有那些让生活更便利的小工具。AI的发展啊,真是你方唱罢我登场,精彩得很。它既有让我们惊叹的‘超能力’,也有需要我们理性看待的‘局限性’。但是可以肯定的是,AI这股浪潮,它不是来一阵风就走的,它会越来越深入地融入到我们生活的方方面面。所以啊,咱们得保持好奇心,保持学习的热情,这样才能在这股浪潮里,稳稳地站住脚跟。 + +今天的情报就到这里,注意隐蔽,赶紧撤离。 + +本期关键词: +#AI模型 +#GoogleAIStudio +#Gemini2.5Pro +#商业化 +#阿里 +#通义千问3 +#大模型 +#开源 +#MonkeyOCR +#文档解析 +#高考数学 +#AI能力 +#ChatGPT +#Atari2600 +#AI编程代理 +#检索增强生成 +#PayQrcode +#Liblib +#FLUXKontext +#收款码 \ No newline at end of file diff --git a/podcast/2025-06-11.md b/podcast/2025-06-11.md new file mode 100644 index 0000000..c4ec50b --- /dev/null +++ b/podcast/2025-06-11.md @@ -0,0 +1,90 @@ +# 来生小酒馆 2025/6/11 + +当AI都能随心所欲地生成高质量视频,甚至像专业摄影师一样运镜时,我们人类的创意还值不值钱,或者说,我们应该如何定义“创意”本身呢?假如AI可以通过“玩游戏”来提升推理能力,甚至能把小模型训练得比大模型还聪明,那我们传统的学习和“进化”方式,是不是也该跟着变一变了?而在一个AI无所不能的未来,我们人类最终的核心竞争力,是不是真的只剩下那些机器无法替代的“品味”、“判断力”和对“目的的理解”了呢? + +嘿,亲爱的V,欢迎收听新一期的来生情报站,我是你们的老朋友,何夕2077。这几个问题啊,听着有点儿“灵魂拷问”的意思,但这不就是咱们“来生情报站”的传统艺能嘛!今天,咱们就来聊聊最近AI圈儿里又出了哪些新鲜事儿,看看它又是怎么悄悄改变我们的未来。 + +首先,咱们说说这**豆包大模型家族**,那真是越来越像个“创意魔法棒”了。听说了吗?他们马上要发布一个**视频生成模型**。这玩意儿可不是闹着玩儿的,什么“无缝多镜头叙事”啊,“精准响应多动作”啊,甚至还能像个专业摄影师一样,帮你**随心运镜**!你说这以后,拍电影、拍短视频,是不是直接跟AI说一句:“来个史诗级开头,男女主角来段感人肺腑的对手戏,再配上电影大片的感觉,镜头摇晃一下,情绪递进,收!”然后,Duang~视频就出来了?那我们这些影视民工,以后是转型做AI调参师呢,还是直接去学说相声,反正手艺活是越来越难了,你说是不是这个理儿? + +接着,咱们聊聊马斯克家的**Grok**。这哥们儿,现在是**X平台推荐算法**的“当家人”了。以前啊,大家总觉得在X上,你粉丝少,内容再好也容易“蒙尘”。这下好了,Grok说:“我只认**高质量内容**,不看你粉丝多不多!”这无疑是给那些“小号”和新人,提供了前所未有的**曝光机会**。嗯,想想都替那些默默耕耘的“小透明”们高兴啊!这回好了,你那些精心打磨的段子,可能终于有机会被更多人看到了,再也不用担心被那些“标题党”或者“蹭热度”的大V们盖过去了。 + +说到豆包,他们的App最近也给**“一句话P图”功能**来了个大升级。你想想,以后P图,可能就是一句话的事儿,比如“把老板P成吴彦祖”,或者“把我P成今天没加班的样子”,你看多方便!以前你得对着Photoshop那一大堆按钮发愁,现在呢,**“修图小白”也能变身“修图大师”**。这简直是把专业修图师请进了手机,那专业的修图师看了,估计得赶紧转型去给人做AI教学去了。 + +再说说苹果。他们家的iOS 26系统也来了个“杀手级”功能,叫**“视觉智能”**。有了它,你手机屏幕上任何图片、任何信息,你都能直接提问、搜索,甚至自动识别事件详情,加入日历。哎,这功能好啊,以后你老板要是给你发个截图,上面密密麻麻的文字,你一眼扫过去,AI就能帮你总结重点,甚至自动把会议时间加到日历里。完美避开“老板,你刚才说啥来着?”的尴尬,直接提升你在职场的“蒙混过关”能力!开玩笑啊,是提高效率! + +还有个小玩意儿,叫**“沉浸式翻译”**。现在它能对**推特(X)视频进行实时翻译**了,即使原视频没有字幕,它也能帮你“神同步”地显示**中英双语字幕**。这下好了,以后看马斯克在X上直播,即使他语速飞快,你也能跟上,甚至能跟他对骂……呃,不是,是流利地交流。是不是感觉离成为国际人才又近了一步? + +再看前沿研究,咱们香港大学和华为诺亚方舟实验室,捣鼓出了个**FUDOKI**模型。名字听着有点儿像日本料理,但本事可不小,它在**图像生成**方面表现惊艳,听着就很高大上,像是什么武林秘籍里的招式,‘非掩码离散流匹配’,听着就感觉能打通任督二脉。 + +香港科技大学和快手科技的**EvoSearch(进化搜索)技术**也很有意思。你看,达尔文的进化论不仅适用于生物界,现在AI作画也开始搞“进化”了。这不就相当于,以前你得开个巨型SUV才能跑长途,现在一辆小排量轿车,经过“进化”,也能跑得又快又稳,甚至更省油。这告诉我们什么?别光看块头大,小个子也有大智慧! + +还有一篇研究叫**“玩中泛化”**,说的是**多模态大型语言模型(MLLMs)**通过玩简单的**街机游戏**,竟然能**显著提升其跨领域的多模态推理能力**。是不是听着就想起来你小时候玩《魂斗罗》、玩《超级玛丽》?原来我们玩游戏是在训练自己的推理能力啊!以后家长再也不用担心孩子沉迷游戏了,直接跟他说:“孩子,玩吧!这是在为通用AI的发展做贡献!” + +说完了技术,咱们看看AI对社会的影响。理想汽车最近也开始“不务正业”了,成立了**“空间机器人”**和**“穿戴机器人”**两个部门。这不就是告诉大家,他们不光卖车,还卖“未来生活”吗?以后你的车不仅仅是车,还能变成你的移动办公室,甚至能帮你穿戴机器人做饭。这要是把车卖出去了,再卖个机器人,这生意,啧啧,叫什么?叫“捆绑销售”! + +更厉害的是,**俄亥俄州立大学**宣布,从今年起,将**强制所有学生接受AI培训**。你看,国外大学都开始强制学生学AI了,咱们国内的打工人,是不是也得赶紧把AI用起来啊?不然以后简历上写“熟练使用Office”,可能就显得有点……呃,“复古”了。 + +知名思考者李继刚老师也一针见血地指出,当AI技术变得越发**高效强大**时,人类的**判断力、品味和对事物目的的理解**反而会变得更为**硬核**。AI再牛,它也P不出你加班后那张生无可恋却又强颜欢笑的脸。它能生成一万种方案,但哪个是好方案,哪个是“有内味儿”的方案,还得咱们人来拍板。所以啊,别担心被AI取代,赶紧提升你的“品味”和“判断力”吧,这是你立足江湖的根本! + +最后,跟大家分享个小故事。有位朋友说,他远程团队的成员一开始因为担心被视为偷懒,**不敢充分使用AI**。但经过他多次分享“正确用法”后,团队逐渐“放开手脚”,结果代码的**注释、规范和质量**都显著提升,同事们也展现出更高的**自信**。你看,这不是活生生的例子吗?AI不是来抢你饭碗的,是来帮你把饭碗里的活儿干得更漂亮,顺便还能让你多一点自信,少一点加班。这不就是“双赢”吗? + +今天的情报就到这里,注意隐蔽,赶紧撤离。 + +本期关键词: +#豆包大模型家族 +#豆包·视频生成模型 +#视频生成 +#Grok +#X平台 +#推荐算法 +#高质量内容 +#豆包App +#一句话P图 +#图像编辑 +#苹果 +#iOS 26 +#视觉智能 +#智能眼 +#沉浸式翻译 +#实时翻译 +#FUDOKI模型 +#多模态生成 +#通用人工智能 +#EvoSearch +#进化搜索 +#AI作画 +#小模型 +#高质量图像 +#玩中泛化 +#游戏学习推理 +#多模态大型语言模型 +#Dreamland +#虚拟世界 +#具身AI智能体 +#理想汽车 +#空间机器人 +#穿戴机器人 +#智能出行生态 +#俄亥俄州立大学 +#AI培训 +#AI流利度 +#李继刚 +#判断力 +#品味 +#人类专属技能 +#小红书 +#dots.llm1 +#开源文本大模型 +#混合专家模型 +#GitHub +#newsnow +#GenAI_Agents +#Mirage虚拟人模型 +#虚拟人视频 +#Sam Altman +#o3产品 +#Ryan ᵐᶠᵉʳ +#下一代创业者 +#玩乐精神 +#AI焦虑 +#代码质量 \ No newline at end of file diff --git a/src/auth.js b/src/auth.js deleted file mode 100644 index 87748d2..0000000 --- a/src/auth.js +++ /dev/null @@ -1,177 +0,0 @@ -// src/auth.js -const SESSION_COOKIE_NAME = 'session_id_89757'; -const SESSION_EXPIRATION_SECONDS = 60 * 60; // 1 hour - -// Function to generate the login page HTML -function generateLoginPage(redirectUrl) { - return ` - - - - - - Login - - - - - - - `; -} - -// Function to set or renew the session cookie -function setSessionCookie(sessionId) { - const expirationDate = new Date(Date.now() + SESSION_EXPIRATION_SECONDS * 1000); - return `${SESSION_COOKIE_NAME}=${sessionId}; Path=/; Expires=${expirationDate.toUTCString()}; HttpOnly; Secure; SameSite=Lax`; -} - -// Function to handle login requests -async function handleLogin(request, env) { - if (request.method === 'GET') { - const url = new URL(request.url); - const redirectUrl = url.searchParams.get('redirect') || '/getContentHtml'; - return new Response(generateLoginPage(redirectUrl), { - headers: { 'Content-Type': 'text/html; charset=utf-8' }, - }); - } else if (request.method === 'POST') { - const formData = await request.formData(); - const username = formData.get('username'); - const password = formData.get('password'); - const redirect = formData.get('redirect') || '/'; - - if (username === env.LOGIN_USERNAME && password === env.LOGIN_PASSWORD) { - const sessionId = crypto.randomUUID(); // Generate a simple session ID - - // Store sessionId in KV store for persistent sessions - // await env.DATA_KV.put(`session:${sessionId}`, 'valid', { expirationTtl: SESSION_EXPIRATION_SECONDS }); - - const cookie = setSessionCookie(sessionId); - - return new Response('Login successful', { - status: 200, - headers: { - 'Set-Cookie': cookie, - 'X-Redirect-Url': redirect, // Custom header for client-side redirect - }, - }); - } else { - return new Response('Invalid username or password', { status: 401 }); - } - } - return new Response('Method Not Allowed', { status: 405 }); -} - -// Function to check and renew session cookie -async function isAuthenticated(request, env) { - const cookieHeader = request.headers.get('Cookie'); - if (!cookieHeader) { - return { authenticated: false, cookie: null }; - } - - const cookies = cookieHeader.split(';').map(c => c.trim()); - const sessionCookie = cookies.find(cookie => cookie.startsWith(`${SESSION_COOKIE_NAME}=`)); - - if (!sessionCookie) { - return { authenticated: false, cookie: null }; - } - - const sessionId = sessionCookie.split('=')[1]; - - // Validate sessionId against KV store - // const storedSession = await env.DATA_KV.get(`session:${sessionId}`); - // if (storedSession !== 'valid') { - // return { authenticated: false, cookie: null }; - // } - - // Renew the session cookie - const newCookie = setSessionCookie(sessionId); - return { authenticated: true, cookie: newCookie }; -} - -// Function to handle logout requests -async function handleLogout(request, env) { - const cookieHeader = request.headers.get('Cookie'); - if (cookieHeader) { - const cookies = cookieHeader.split(';').map(c => c.trim()); - const sessionCookie = cookies.find(cookie => cookie.startsWith(`${SESSION_COOKIE_NAME}=`)); - if (sessionCookie) { - const sessionId = sessionCookie.split('=')[1]; - // Delete session from KV store - // await env.DATA_KV.delete(`session:${sessionId}`); - } - } - - const expiredDate = new Date(0); // Set expiration to a past date - const cookie = `${SESSION_COOKIE_NAME}=; Path=/; Expires=${expiredDate.toUTCString()}; HttpOnly; Secure; SameSite=Lax`; - - const url = new URL(request.url); - const redirectUrl = url.searchParams.get('redirect') || '/login'; // Redirect to login page by default - - return new Response('Logged out', { - status: 302, - headers: { - 'Set-Cookie': cookie, - 'Location': redirectUrl, - }, - }); -} - -export { - handleLogin, - isAuthenticated, - handleLogout, - SESSION_COOKIE_NAME, - SESSION_EXPIRATION_SECONDS, -}; diff --git a/src/chatapi.js b/src/chatapi.js deleted file mode 100644 index 6d780a8..0000000 --- a/src/chatapi.js +++ /dev/null @@ -1,567 +0,0 @@ -// src/chatapi.js - -/** - * Calls the Gemini Chat API (non-streaming). - * - * @param {object} env - Environment object containing GEMINI_API_URL. - * @param {string} promptText - The user's prompt. - * @param {string | null} [systemPromptText=null] - Optional system prompt text. - * @returns {Promise} The generated text content. - * @throws {Error} If GEMINI_API_URL is not set, or if API call fails or returns blocked/empty content. - */ -async function callGeminiChatAPI(env, promptText, systemPromptText = null) { - if (!env.GEMINI_API_URL) { - throw new Error("GEMINI_API_URL environment variable is not set."); - } - if (!env.GEMINI_API_KEY) { - throw new Error("GEMINI_API_KEY environment variable is not set for Gemini models."); - } - const modelName = env.DEFAULT_GEMINI_MODEL; - const url = `${env.GEMINI_API_URL}/v1beta/models/${modelName}:generateContent?key=${env.GEMINI_API_KEY}`; - const payload = { - contents: [{ - parts: [{ text: promptText }] - }], - }; - - if (systemPromptText && typeof systemPromptText === 'string' && systemPromptText.trim() !== '') { - payload.systemInstruction = { - parts: [{ text: systemPromptText }] - }; - console.log("System instruction included in Chat API call."); - } - - try { - const response = await fetch(url, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(payload) - }); - - if (!response.ok) { - const errorBodyText = await response.text(); - let errorData; - try { - errorData = JSON.parse(errorBodyText); - } catch (e) { - errorData = errorBodyText; - } - console.error("Gemini Chat API Error Response Body:", typeof errorData === 'object' ? JSON.stringify(errorData, null, 2) : errorData); - const message = typeof errorData === 'object' && errorData.error?.message - ? errorData.error.message - : (typeof errorData === 'string' ? errorData : 'Unknown Gemini Chat API error'); - throw new Error(`Gemini Chat API error (${response.status}): ${message}`); - } - - const data = await response.json(); - - // 1. Check for prompt-level blocking first - if (data.promptFeedback && data.promptFeedback.blockReason) { - const blockReason = data.promptFeedback.blockReason; - const safetyRatings = data.promptFeedback.safetyRatings ? JSON.stringify(data.promptFeedback.safetyRatings) : 'N/A'; - console.error(`Gemini Chat prompt blocked: ${blockReason}. Safety ratings: ${safetyRatings}`, JSON.stringify(data, null, 2)); - throw new Error(`Gemini Chat prompt blocked: ${blockReason}. Safety ratings: ${safetyRatings}`); - } - - // 2. Check candidates and their content - if (data.candidates && data.candidates.length > 0) { - const candidate = data.candidates[0]; - - // Check finishReason for issues other than STOP - // Common finishReasons: STOP, MAX_TOKENS, SAFETY, RECITATION, OTHER - if (candidate.finishReason && candidate.finishReason !== "STOP") { - const reason = candidate.finishReason; - const safetyRatings = candidate.safetyRatings ? JSON.stringify(candidate.safetyRatings) : 'N/A'; - console.error(`Gemini Chat content generation finished with reason: ${reason}. Safety ratings: ${safetyRatings}`, JSON.stringify(data, null, 2)); - if (reason === "SAFETY") { - throw new Error(`Gemini Chat content generation blocked due to safety (${reason}). Safety ratings: ${safetyRatings}`); - } - throw new Error(`Gemini Chat content generation finished due to: ${reason}. Safety ratings: ${safetyRatings}`); - } - - // If finishReason is STOP, try to extract text - if (candidate.content && candidate.content.parts && candidate.content.parts.length > 0 && candidate.content.parts[0].text) { - return candidate.content.parts[0].text; - } else { - // finishReason was STOP (or not present, implying success), but no text. - console.warn("Gemini Chat API response has candidate with 'STOP' finishReason but no text content, or content structure is unexpected.", JSON.stringify(data, null, 2)); - throw new Error("Gemini Chat API returned a candidate with 'STOP' finishReason but no text content."); - } - } else { - // No candidates, and no promptFeedback block reason either (handled above). - // This means the response is empty or malformed in an unexpected way. - console.warn("Gemini Chat API response format unexpected: No candidates found and no prompt block reason.", JSON.stringify(data, null, 2)); - throw new Error("Gemini Chat API returned an empty or malformed response with no candidates."); - } - } catch (error) { - // Log the full error object if it's not one we constructed, or just re-throw - if (!(error instanceof Error && error.message.startsWith("Gemini Chat"))) { - console.error("Error calling Gemini Chat API (Non-streaming):", error); - } - throw error; - } -} - - -/** - * Calls the Gemini Chat API with streaming. - * - * @param {object} env - Environment object containing GEMINI_API_URL. - * @param {string} promptText - The user's prompt. - * @param {string | null} [systemPromptText=null] - Optional system prompt text. - * @returns {AsyncGenerator} An async generator yielding text chunks. - * @throws {Error} If GEMINI_API_URL is not set, or if API call fails or returns blocked/empty content. - */ -async function* callGeminiChatAPIStream(env, promptText, systemPromptText = null) { - if (!env.GEMINI_API_URL) { - throw new Error("GEMINI_API_URL environment variable is not set."); - } - if (!env.GEMINI_API_KEY) { - throw new Error("GEMINI_API_KEY environment variable is not set for Gemini models."); - } - const modelName = env.DEFAULT_GEMINI_MODEL; - const url = `${env.GEMINI_API_URL}/v1beta/models/${modelName}:streamGenerateContent?key=${env.GEMINI_API_KEY}&alt=sse`; - - const payload = { - contents: [{ - parts: [{ text: promptText }] - }], - }; - - if (systemPromptText && typeof systemPromptText === 'string' && systemPromptText.trim() !== '') { - payload.systemInstruction = { - parts: [{ text: systemPromptText }] - }; - console.log("System instruction included in Chat API call."); - } - - let response; - try { - response = await fetch(url, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify(payload) - }); - - if (!response.ok) { - const errorBodyText = await response.text(); - let errorData; - try { - errorData = JSON.parse(errorBodyBody); - } catch (e) { - errorData = errorBodyText; - } - console.error("Gemini Chat API Error (Stream Initial) Response Body:", typeof errorData === 'object' ? JSON.stringify(errorData, null, 2) : errorData); - const message = typeof errorData === 'object' && errorData.error?.message - ? errorData.error.message - : (typeof errorData === 'string' ? errorData : 'Unknown Gemini Chat API error'); - throw new Error(`Gemini Chat API error (${response.status}): ${message}`); - } - - if (!response.body) { - throw new Error("Response body is null, cannot stream."); - } - - const reader = response.body.getReader(); - const decoder = new TextDecoder(); - let buffer = ""; - let hasYieldedContent = false; - let overallFinishReason = null; // To track the final finish reason if available - let finalSafetyRatings = null; - - const processJsonChunk = (jsonString) => { - if (jsonString.trim() === "") return null; - try { - return JSON.parse(jsonString); - } catch (e) { - console.warn("Failed to parse JSON chunk from stream:", jsonString, e.message); - return null; // Or throw, depending on how strictly you want to handle malformed JSON - } - }; - - const handleChunkLogic = (chunk) => { - if (!chunk) return false; // Not a valid chunk to process - - // 1. Check for prompt-level blocking (might appear in first chunk) - if (chunk.promptFeedback && chunk.promptFeedback.blockReason) { - const blockReason = chunk.promptFeedback.blockReason; - const safetyRatings = chunk.promptFeedback.safetyRatings ? JSON.stringify(chunk.promptFeedback.safetyRatings) : 'N/A'; - console.error(`Gemini Chat prompt blocked during stream: ${blockReason}. Safety ratings: ${safetyRatings}`, JSON.stringify(chunk, null, 2)); - throw new Error(`Gemini Chat prompt blocked: ${blockReason}. Safety ratings: ${safetyRatings}`); - } - - // 2. Check candidates - if (chunk.candidates && chunk.candidates.length > 0) { - const candidate = chunk.candidates[0]; - if (candidate.finishReason) { - overallFinishReason = candidate.finishReason; // Store the latest finish reason - finalSafetyRatings = candidate.safetyRatings; - - if (candidate.finishReason !== "STOP") { - const reason = candidate.finishReason; - const sr = candidate.safetyRatings ? JSON.stringify(candidate.safetyRatings) : 'N/A'; - console.error(`Gemini Chat stream candidate finished with reason: ${reason}. Safety ratings: ${sr}`, JSON.stringify(chunk, null, 2)); - if (reason === "SAFETY") { - throw new Error(`Gemini Chat content generation blocked due to safety (${reason}). Safety ratings: ${sr}`); - } - throw new Error(`Gemini Chat stream finished due to: ${reason}. Safety ratings: ${sr}`); - } - } - - if (candidate.content && candidate.content.parts && candidate.content.parts.length > 0) { - const textPart = candidate.content.parts[0].text; - if (textPart && typeof textPart === 'string') { - hasYieldedContent = true; - return textPart; // This is the text to yield - } - } - } else if (chunk.error) { // Check for explicit error object in stream - console.error("Gemini Chat API Stream Error Chunk:", JSON.stringify(chunk.error, null, 2)); - throw new Error(`Gemini Chat API stream error: ${chunk.error.message || 'Unknown error in stream'}`); - } - return null; // No text to yield from this chunk - }; - - - while (true) { - const { done, value } = await reader.read(); - if (done) { - break; - } - - buffer += decoder.decode(value, { stream: true }); - - let eventBoundary; - while ((eventBoundary = buffer.indexOf('\n\n')) !== -1 || (eventBoundary = buffer.indexOf('\n')) !== -1) { - const separatorLength = (buffer.indexOf('\n\n') === eventBoundary) ? 2 : 1; - let message = buffer.substring(0, eventBoundary); - buffer = buffer.substring(eventBoundary + separatorLength); - - if (message.startsWith("data: ")) { - message = message.substring(5).trim(); - } else { - message = message.trim(); - } - - if (message === "" || message === "[DONE]") { - continue; - } - - const parsedChunk = processJsonChunk(message); - if (parsedChunk) { - const textToYield = handleChunkLogic(parsedChunk); - if (textToYield !== null) { - yield textToYield; - } - } - } - } - - // Process any remaining data in the buffer (if not ending with newline(s)) - if (buffer.trim()) { - let finalMessage = buffer.trim(); - if (finalMessage.startsWith("data: ")) { - finalMessage = finalMessage.substring(5).trim(); - } - if (finalMessage !== "" && finalMessage !== "[DONE]") { - const parsedChunk = processJsonChunk(finalMessage); - if (parsedChunk) { - const textToYield = handleChunkLogic(parsedChunk); - if (textToYield !== null) { - yield textToYield; - } - } - } - } - - // After the stream has finished, check if any content was yielded and the overall outcome - if (!hasYieldedContent) { - if (overallFinishReason && overallFinishReason !== "STOP") { - const sr = finalSafetyRatings ? JSON.stringify(finalSafetyRatings) : 'N/A'; - console.warn(`Gemini Chat stream ended with reason '${overallFinishReason}' and no content was yielded. Safety: ${sr}`); - throw new Error(`Gemini Chat stream completed due to ${overallFinishReason} without yielding content. Safety ratings: ${sr}`); - } else if (overallFinishReason === "STOP") { - console.warn("Gemini Chat stream finished with 'STOP' but no content was yielded.", JSON.stringify({overallFinishReason, finalSafetyRatings}, null, 2)); - throw new Error("Gemini Chat stream completed with 'STOP' but yielded no content."); - } else if (!overallFinishReason) { - console.warn("Gemini Chat stream ended without yielding any content or a clear finish reason."); - throw new Error("Gemini Chat stream completed without yielding any content."); - } - } - - } catch (error) { - if (!(error instanceof Error && error.message.startsWith("Gemini Chat"))) { - console.error("Error calling or streaming from Gemini Chat API:", error); - } - throw error; - } -} - -/** - * Calls the OpenAI Chat API (non-streaming). - * - * @param {object} env - Environment object containing OPENAI_API_URL and OPENAI_API_KEY. - * @param {string} promptText - The user's prompt. - * @param {string | null} [systemPromptText=null] - Optional system prompt text. - * @returns {Promise} The generated text content. - * @throws {Error} If OPENAI_API_URL or OPENAI_API_KEY is not set, or if API call fails. - */ -async function callOpenAIChatAPI(env, promptText, systemPromptText = null) { - if (!env.OPENAI_API_URL) { - throw new Error("OPENAI_API_URL environment variable is not set."); - } - if (!env.OPENAI_API_KEY) { - throw new Error("OPENAI_API_KEY environment variable is not set for OpenAI models."); - } - const url = `${env.OPENAI_API_URL}/v1/chat/completions`; - - const messages = []; - if (systemPromptText && typeof systemPromptText === 'string' && systemPromptText.trim() !== '') { - messages.push({ role: "system", content: systemPromptText }); - console.log("System instruction included in OpenAI Chat API call."); - } - messages.push({ role: "user", content: promptText }); - - const modelName = env.DEFAULT_OPEN_MODEL; - const payload = { - model: modelName, - messages: messages, - temperature: 1, - max_tokens: 2048, - top_p: 1, - frequency_penalty: 0, - presence_penalty: 0, - }; - - try { - const response = await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${env.OPENAI_API_KEY}` - }, - body: JSON.stringify(payload) - }); - - if (!response.ok) { - const errorBodyText = await response.text(); - let errorData; - try { - errorData = JSON.parse(errorBodyText); - } catch (e) { - errorData = errorBodyText; - } - console.error("OpenAI Chat API Error Response Body:", typeof errorData === 'object' ? JSON.stringify(errorData, null, 2) : errorData); - const message = typeof errorData === 'object' && errorData.error?.message - ? errorData.error.message - : (typeof errorData === 'string' ? errorData : 'Unknown OpenAI Chat API error'); - throw new Error(`OpenAI Chat API error (${response.status}): ${message}`); - } - - const data = await response.json(); - - if (data.choices && data.choices.length > 0 && data.choices[0].message && data.choices[0].message.content) { - return data.choices[0].message.content; - } else { - console.warn("OpenAI Chat API response format unexpected: No choices or content found.", JSON.stringify(data, null, 2)); - throw new Error("OpenAI Chat API returned an empty or malformed response."); - } - } catch (error) { - if (!(error instanceof Error && error.message.startsWith("OpenAI Chat"))) { - console.error("Error calling OpenAI Chat API (Non-streaming):", error); - } - throw error; - } -} - -/** - * Calls the OpenAI Chat API with streaming. - * - * @param {object} env - Environment object containing OPENAI_API_URL and OPENAI_API_KEY. - * @param {string} promptText - The user's prompt. - * @param {string | null} [systemPromptText=null] - Optional system prompt text. - * @returns {AsyncGenerator} An async generator yielding text chunks. - * @throws {Error} If OPENAI_API_URL or OPENAI_API_KEY is not set, or if API call fails. - */ -async function* callOpenAIChatAPIStream(env, promptText, systemPromptText = null) { - if (!env.OPENAI_API_URL) { - throw new Error("OPENAI_API_URL environment variable is not set."); - } - if (!env.OPENAI_API_KEY) { - throw new Error("OPENAI_API_KEY environment variable is not set for OpenAI models."); - } - const url = `${env.OPENAI_API_URL}/v1/chat/completions`; - - const messages = []; - if (systemPromptText && typeof systemPromptText === 'string' && systemPromptText.trim() !== '') { - messages.push({ role: "system", content: systemPromptText }); - console.log("System instruction included in OpenAI Chat API call."); - } - messages.push({ role: "user", content: promptText }); - - const modelName = env.DEFAULT_OPEN_MODEL; - const payload = { - model: modelName, - messages: messages, - temperature: 1, - max_tokens: 2048, - top_p: 1, - frequency_penalty: 0, - presence_penalty: 0, - stream: true, - }; - - let response; - try { - response = await fetch(url, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${env.OPENAI_API_KEY}` - }, - body: JSON.stringify(payload) - }); - - if (!response.ok) { - const errorBodyText = await response.text(); - let errorData; - try { - errorData = JSON.parse(errorBodyText); - } catch (e) { - errorData = errorBodyText; - } - console.error("OpenAI Chat API Error (Stream Initial) Response Body:", typeof errorData === 'object' ? JSON.stringify(errorData, null, 2) : errorData); - const message = typeof errorData === 'object' && errorData.error?.message - ? errorData.error.message - : (typeof errorData === 'string' ? errorData : 'Unknown OpenAI Chat API error'); - throw new Error(`OpenAI Chat API error (${response.status}): ${message}`); - } - - if (!response.body) { - throw new Error("Response body is null, cannot stream."); - } - - const reader = response.body.getReader(); - const decoder = new TextDecoder(); - let buffer = ""; - let hasYieldedContent = false; - - while (true) { - const { done, value } = await reader.read(); - if (done) { - break; - } - - buffer += decoder.decode(value, { stream: true }); - - // OpenAI streaming uses data: {JSON}\n\n - let eventBoundary; - while ((eventBoundary = buffer.indexOf('\n\n')) !== -1) { - let message = buffer.substring(0, eventBoundary); - buffer = buffer.substring(eventBoundary + 2); // +2 for '\n\n' - - if (message.startsWith("data: ")) { - message = message.substring(5).trim(); - } else { - message = message.trim(); - } - - if (message === "" || message === "[DONE]") { - continue; - } - - try { - const parsedChunk = JSON.parse(message); - if (parsedChunk.choices && parsedChunk.choices.length > 0) { - const delta = parsedChunk.choices[0].delta; - if (delta && delta.content) { - hasYieldedContent = true; - yield delta.content; - } - } else if (parsedChunk.error) { - console.error("OpenAI Chat API Stream Error Chunk:", JSON.stringify(parsedChunk.error, null, 2)); - throw new Error(`OpenAI Chat API stream error: ${parsedChunk.error.message || 'Unknown error in stream'}`); - } - } catch (e) { - console.warn("Failed to parse JSON chunk from OpenAI stream:", message, e.message); - // Continue processing, might be an incomplete chunk - } - } - } - - // Process any remaining data in the buffer - if (buffer.trim()) { - let finalMessage = buffer.trim(); - if (finalMessage.startsWith("data: ")) { - finalMessage = finalMessage.substring(5).trim(); - } - if (finalMessage !== "" && finalMessage !== "[DONE]") { - try { - const parsedChunk = JSON.parse(finalMessage); - if (parsedChunk.choices && parsedChunk.choices.length > 0) { - const delta = parsedChunk.choices[0].delta; - if (delta && delta.content) { - hasYieldedContent = true; - yield delta.content; - } - } else if (parsedChunk.error) { - console.error("OpenAI Chat API Stream Error Chunk:", JSON.stringify(parsedChunk.error, null, 2)); - throw new Error(`OpenAI Chat API stream error: ${parsedChunk.error.message || 'Unknown error in stream'}`); - } - } catch (e) { - console.warn("Failed to parse final JSON chunk from OpenAI stream:", finalMessage, e.message); - } - } - } - - if (!hasYieldedContent) { - console.warn("OpenAI Chat stream finished but no content was yielded."); - throw new Error("OpenAI Chat stream completed but yielded no content."); - } - - } catch (error) { - if (!(error instanceof Error && error.message.startsWith("OpenAI Chat"))) { - console.error("Error calling or streaming from OpenAI Chat API:", error); - } - throw error; - } -} - - -/** - * Main function to call the appropriate chat API (Gemini or OpenAI) based on model name. - * Defaults to Gemini if no specific API is indicated in the model name. - * - * @param {object} env - Environment object. - * @param {string} promptText - The user's prompt. - * @param {string | null} [systemPromptText=null] - Optional system prompt text. - * @returns {Promise} The generated text content. - * @throws {Error} If API keys/URLs are not set, or if API call fails. - */ -export async function callChatAPI(env, promptText, systemPromptText = null) { - const platform = env.USE_MODEL_PLATFORM; - if (platform.startsWith("OPEN")) { - return callOpenAIChatAPI(env, promptText, systemPromptText); - } else { // Default to Gemini - return callGeminiChatAPI(env, promptText, systemPromptText); - } -} - -/** - * Main function to call the appropriate chat API (Gemini or OpenAI) with streaming. - * Defaults to Gemini if no specific API is indicated in the model name. - * - * @param {object} env - Environment object. - * @param {string} promptText - The user's prompt. - * @param {string | null} [systemPromptText=null] - Optional system prompt text. - * @returns {AsyncGenerator} An async generator yielding text chunks. - * @throws {Error} If API keys/URLs are not set, or if API call fails. - */ -export async function* callChatAPIStream(env, promptText, systemPromptText = null) { - const platform = env.USE_MODEL_PLATFORM; - if (platform.startsWith("OPEN")) { - yield* callOpenAIChatAPIStream(env, promptText, systemPromptText); - } else { // Default to Gemini - yield* callGeminiChatAPIStream(env, promptText, systemPromptText); - } -} diff --git a/src/dataFetchers.js b/src/dataFetchers.js deleted file mode 100644 index 7575b97..0000000 --- a/src/dataFetchers.js +++ /dev/null @@ -1,91 +0,0 @@ -// src/dataFetchers.js -import AibaseDataSource from './dataSources/aibase.js'; -import GithubTrendingDataSource from './dataSources/github-trending.js'; -import HuggingfacePapersDataSource from './dataSources/huggingface-papers.js'; -import XiaohuDataSource from './dataSources/xiaohu.js'; -import TwitterDataSource from './dataSources/twitter.js'; - -// Register data sources as arrays to support multiple sources per type -export const dataSources = { - news: { name: '新闻', sources: [AibaseDataSource, XiaohuDataSource] }, - project: { name: '项目', sources: [GithubTrendingDataSource] }, - paper: { name: '论文', sources: [HuggingfacePapersDataSource] }, - socialMedia: { name: '社交平台', sources: [TwitterDataSource] }, - // Add new data sources here as arrays, e.g., - // newType: { name: '新类型', sources: [NewTypeDataSource1, NewTypeDataSource2] }, -}; - -/** - * Fetches and transforms data from all data sources for a specified type. - * @param {string} sourceType - The type of data source (e.g., 'news', 'projects', 'papers'). - * @param {object} env - The environment variables. - * @param {string} [foloCookie] - The Folo authentication cookie. - * @returns {Promise>} A promise that resolves to an array of unified data objects from all sources of that type. - */ -export async function fetchAndTransformDataForType(sourceType, env, foloCookie) { - const sources = dataSources[sourceType].sources; - if (!sources || !Array.isArray(sources)) { - console.error(`No data sources registered for type: ${sourceType}`); - return []; - } - - let allUnifiedDataForType = []; - for (const dataSource of sources) { - try { - // Pass foloCookie to the fetch method of the data source - const rawData = await dataSource.fetch(env, foloCookie); - const unifiedData = dataSource.transform(rawData, sourceType); - allUnifiedDataForType = allUnifiedDataForType.concat(unifiedData); - } catch (error) { - console.error(`Error fetching or transforming data from source ${dataSource.type} for type ${sourceType}:`, error.message); - // Continue to next data source even if one fails - } - } - - // Sort by published_date in descending order for each type - allUnifiedDataForType.sort((a, b) => { - const dateA = new Date(a.published_date); - const dateB = new Date(b.published_date); - return dateB.getTime() - dateA.getTime(); - }); - - return allUnifiedDataForType; -} - -/** - * Fetches and transforms data from all registered data sources across all types. - * @param {object} env - The environment variables. - * @param {string} [foloCookie] - The Folo authentication cookie. - * @returns {Promise} A promise that resolves to an object containing unified data for each source type. - */ -export async function fetchAllData(env, foloCookie) { - const allUnifiedData = {}; - const fetchPromises = []; - - for (const sourceType in dataSources) { - if (Object.hasOwnProperty.call(dataSources, sourceType)) { - fetchPromises.push( - fetchAndTransformDataForType(sourceType, env, foloCookie).then(data => { - allUnifiedData[sourceType] = data; - }) - ); - } - } - await Promise.allSettled(fetchPromises); // Use allSettled to ensure all promises complete - return allUnifiedData; -} - -/** - * Fetches and transforms data from all data sources for a specific category. - * @param {object} env - The environment variables. - * @param {string} category - The category to fetch data for (e.g., 'news', 'project', 'paper', 'twitter'). - * @param {string} [foloCookie] - The Folo authentication cookie. - * @returns {Promise>} A promise that resolves to an array of unified data objects for the specified category. - */ -export async function fetchDataByCategory(env, category, foloCookie) { - if (!dataSources[category]) { - console.warn(`Attempted to fetch data for unknown category: ${category}`); - return []; - } - return await fetchAndTransformDataForType(category, env, foloCookie); -} diff --git a/src/dataSources/aibase.js b/src/dataSources/aibase.js deleted file mode 100644 index 5432cc6..0000000 --- a/src/dataSources/aibase.js +++ /dev/null @@ -1,139 +0,0 @@ -// src/dataSources/aibase.js -import { getRandomUserAgent, sleep, isDateWithinLastDays, stripHtml, formatDateToChineseWithTime, escapeHtml} from '../helpers.js'; - -const NewsDataSource = { - fetch: async (env, foloCookie) => { // Add sourceType - const feedId = env.AIBASE_FEED_ID; - const fetchPages = parseInt(env.AIBASE_FETCH_PAGES || '3', 10); - const allAibaseItems = []; - const filterDays = parseInt(env.FOLO_FILTER_DAYS || '3', 10); - - if (!feedId) { - console.error('AIBASE_FEED_ID is not set in environment variables.'); - return { - version: "https://jsonfeed.org/version/1.1", - title: "AI Base Feeds", - home_page_url: "https://www.aibase.com/", - description: "Aggregated AI Base feeds", - language: "zh-cn", - items: [] - }; - } - - let publishedAfter = null; - for (let i = 0; i < fetchPages; i++) { - const userAgent = getRandomUserAgent(); - const headers = { - 'User-Agent': userAgent, - 'Content-Type': 'application/json', - 'accept': 'application/json', - 'accept-language': 'zh-CN,zh;q=0.9', - 'baggage': 'sentry-environment=stable,sentry-release=5251fa921ef6cbb6df0ac4271c41c2b4a0ce7c50,sentry-public_key=e5bccf7428aa4e881ed5cb713fdff181,sentry-trace_id=2da50ca5ad944cb794670097d876ada8,sentry-sampled=true,sentry-sample_rand=0.06211835167903246,sentry-sample_rate=1', - 'origin': 'https://app.follow.is', - 'priority': 'u=1, i', - 'sec-ch-ua': '"Google Chrome";v="135", "Not-A.Brand";v="8", "Chromium";v="135"', - 'sec-ch-ua-mobile': '?1', - 'sec-ch-ua-platform': '"Android"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-site', - 'x-app-name': 'Folo Web', - 'x-app-version': '0.4.9', - }; - - // 直接使用传入的 foloCookie - if (foloCookie) { - headers['Cookie'] = foloCookie; - } - - const body = { - feedId: feedId, - view: 1, - withContent: true, - }; - - if (publishedAfter) { - body.publishedAfter = publishedAfter; - } - - try { - console.log(`Fetching AI Base data, page ${i + 1}...`); - const response = await fetch(env.FOLO_DATA_API, { - method: 'POST', - headers: headers, - body: JSON.stringify(body), - }); - - if (!response.ok) { - console.error(`Failed to fetch AI Base data, page ${i + 1}: ${response.statusText}`); - break; - } - const data = await response.json(); - if (data && data.data && data.data.length > 0) { - const filteredItems = data.data.filter(entry => isDateWithinLastDays(entry.entries.publishedAt, filterDays)); - allAibaseItems.push(...filteredItems.map(entry => ({ - id: entry.entries.id, - url: entry.entries.url, - title: entry.entries.title, - content_html: entry.entries.content, - date_published: entry.entries.publishedAt, - authors: [{ name: entry.entries.author }], - source: `aibase`, - }))); - publishedAfter = data.data[data.data.length - 1].entries.publishedAt; - } else { - console.log(`No more data for AI Base, page ${i + 1}.`); - break; - } - } catch (error) { - console.error(`Error fetching AI Base data, page ${i + 1}:`, error); - break; - } - - // Random wait time between 0 and 5 seconds to avoid rate limiting - await sleep(Math.random() * 5000); - } - - return { - version: "https://jsonfeed.org/version/1.1", - title: "AI Base Feeds", - home_page_url: "https://www.aibase.com/", - description: "Aggregated AI Base feeds", - language: "zh-cn", - items: allAibaseItems - }; - }, - - transform: (rawData, sourceType) => { // Add sourceType - const unifiedNews = []; - if (rawData && Array.isArray(rawData.items)) { - rawData.items.forEach((item) => { - unifiedNews.push({ - id: item.id, - type: sourceType, // Use sourceType here - url: item.url, - title: item.title, - description: stripHtml(item.content_html || ""), - published_date: item.date_published, - authors: item.authors ? item.authors.map(a => a.name).join(', ') : 'Unknown', - source: item.source || 'AI Base', - details: { - content_html: item.content_html || "" - } - }); - }); - } - return unifiedNews; - }, - - generateHtml: (item) => { - return ` - ${escapeHtml(item.title)}
- 来源: ${escapeHtml(item.source || '未知')} | 发布日期: ${formatDateToChineseWithTime(item.published_date)} -
${item.details.content_html || '无内容。'}
- 阅读更多 - `; - } -}; - -export default NewsDataSource; diff --git a/src/dataSources/github-trending.js b/src/dataSources/github-trending.js deleted file mode 100644 index 0f25e16..0000000 --- a/src/dataSources/github-trending.js +++ /dev/null @@ -1,113 +0,0 @@ -// src/dataSources/projects.js -import { fetchData, getISODate, removeMarkdownCodeBlock, formatDateToChineseWithTime, escapeHtml} from '../helpers.js'; -import { callChatAPI } from '../chatapi.js'; - -const ProjectsDataSource = { - fetch: async (env) => { - console.log(`Fetching projects from: ${env.PROJECTS_API_URL}`); - let projects; - try { - projects = await fetchData(env.PROJECTS_API_URL); - } catch (error) { - console.error("Error fetching projects data:", error.message); - return { error: "Failed to fetch projects data", details: error.message, items: [] }; - } - - if (!Array.isArray(projects)) { - console.error("Projects data is not an array:", projects); - return { error: "Invalid projects data format", received: projects, items: [] }; - } - if (projects.length === 0) { - console.log("No projects fetched from API."); - return { items: [] }; - } - - if (!env.OPEN_TRANSLATE === "true") { - console.warn("Skipping paper translations."); - return projects.map(p => ({ ...p, description_zh: p.description || "" })); - } - - const descriptionsToTranslate = projects - .map(p => p.description || "") - .filter(desc => typeof desc === 'string'); - - const nonEmptyDescriptions = descriptionsToTranslate.filter(d => d.trim() !== ""); - if (nonEmptyDescriptions.length === 0) { - console.log("No non-empty project descriptions to translate."); - return projects.map(p => ({ ...p, description_zh: p.description || "" })); - } - const promptText = `Translate the following English project descriptions to Chinese. -Provide the translations as a JSON array of strings, in the exact same order as the input. -Each string in the output array must correspond to the string at the same index in the input array. -If an input description is an empty string, the corresponding translated string in the output array should also be an empty string. -Input Descriptions (JSON array of strings): -${JSON.stringify(descriptionsToTranslate)} -Respond ONLY with the JSON array of Chinese translations. Do not include any other text or explanations. -JSON Array of Chinese Translations:`; - - let translatedTexts = []; - try { - console.log(`Requesting translation for ${descriptionsToTranslate.length} project descriptions.`); - const chatResponse = await callChatAPI(env, promptText); - const parsedTranslations = JSON.parse(removeMarkdownCodeBlock(chatResponse)); // Assuming direct JSON array response - - if (parsedTranslations && Array.isArray(parsedTranslations) && parsedTranslations.length === descriptionsToTranslate.length) { - translatedTexts = parsedTranslations; - } else { - console.warn(`Translation count mismatch or parsing error for project descriptions. Expected ${descriptionsToTranslate.length}, received ${parsedTranslations ? parsedTranslations.length : 'null'}. Falling back.`); - translatedTexts = descriptionsToTranslate.map(() => null); - } - } catch (translationError) { - console.error("Failed to translate project descriptions in batch:", translationError.message); - translatedTexts = descriptionsToTranslate.map(() => null); - } - - return projects.map((project, index) => { - const translated = translatedTexts[index]; - return { - ...project, - description_zh: (typeof translated === 'string') ? translated : (project.description || "") - }; - }); - }, - transform: (projectsData, sourceType) => { - const unifiedProjects = []; - const now = getISODate(); - if (Array.isArray(projectsData)) { - projectsData.forEach((project, index) => { - unifiedProjects.push({ - id: index + 1, // Use project.url as ID if available - type: sourceType, - url: project.url, - title: project.name, - description: project.description_zh || project.description || "", - published_date: now, // Projects don't have a published date, use current date - authors: project.owner ? [project.owner] : [], - source: "GitHub Trending", - details: { - owner: project.owner, - name: project.name, - language: project.language, - languageColor: project.languageColor, - totalStars: project.totalStars, - forks: project.forks, - starsToday: project.starsToday, - builtBy: project.builtBy || [] - } - }); - }); - } - return unifiedProjects; - }, - - generateHtml: (item) => { - return ` - ${escapeHtml(item.title)} (所有者: ${escapeHtml(item.details.owner)})
- 星标: ${escapeHtml(item.details.totalStars)} (今日: ${escapeHtml(item.details.starsToday)}) | 语言: ${escapeHtml(item.details.language || 'N/A')} - 描述: ${escapeHtml(item.description) || 'N/A'}
- 在 GitHub 上查看 - `; - } -}; - -export default ProjectsDataSource; diff --git a/src/dataSources/huggingface-papers.js b/src/dataSources/huggingface-papers.js deleted file mode 100644 index 3926110..0000000 --- a/src/dataSources/huggingface-papers.js +++ /dev/null @@ -1,204 +0,0 @@ -// src/dataSources/huggingface-papers.js -import { getRandomUserAgent, sleep, isDateWithinLastDays, stripHtml, removeMarkdownCodeBlock, formatDateToChineseWithTime, escapeHtml} from '../helpers.js'; -import { callChatAPI } from '../chatapi.js'; - -const PapersDataSource = { - fetch: async (env, foloCookie) => { - const feedId = env.HGPAPERS_FEED_ID; - const fetchPages = parseInt(env.HGPAPERS_FETCH_PAGES || '3', 10); - const allPapersItems = []; - const filterDays = parseInt(env.FOLO_FILTER_DAYS || '3', 10); - - if (!feedId) { - console.error('HGPAPERS_FEED_ID is not set in environment variables.'); - return { - version: "https://jsonfeed.org/version/1.1", - title: "Huggingface Daily Papers Feeds", - home_page_url: "https://huggingface.co/papers", - description: "Aggregated Huggingface Daily Papers feeds", - language: "zh-cn", - items: [] - }; - } - - let publishedAfter = null; - for (let i = 0; i < fetchPages; i++) { - const userAgent = getRandomUserAgent(); - const headers = { - 'User-Agent': userAgent, - 'Content-Type': 'application/json', - 'accept': 'application/json', - 'accept-language': 'zh-CN,zh;q=0.9', - 'baggage': 'sentry-environment=stable,sentry-release=5251fa921ef6cbb6df0ac4271c41c2b4a0ce7c50,sentry-public_key=e5bccf7428aa4e881ed5cb713fdff181,sentry-trace_id=2da50ca5ad944cb794670097d876ada8,sentry-sampled=true,sentry-sample_rand=0.06211835167903246,sentry-sample_rate=1', - 'origin': 'https://app.follow.is', - 'priority': 'u=1, i', - 'sec-ch-ua': '"Google Chrome";v="135", "Not-A.Brand";v="8", "Chromium";v="135"', - 'sec-ch-ua-mobile': '?1', - 'sec-ch-ua-platform': '"Android"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-site', - 'x-app-name': 'Folo Web', - 'x-app-version': '0.4.9', - }; - - // 直接使用传入的 foloCookie - if (foloCookie) { - headers['Cookie'] = foloCookie; - } - - const body = { - feedId: feedId, - view: 1, - withContent: true, - }; - - if (publishedAfter) { - body.publishedAfter = publishedAfter; - } - - try { - console.log(`Fetching Huggingface Papers data, page ${i + 1}...`); - const response = await fetch(env.FOLO_DATA_API, { - method: 'POST', - headers: headers, - body: JSON.stringify(body), - }); - - if (!response.ok) { - console.error(`Failed to fetch Huggingface Papers data, page ${i + 1}: ${response.statusText}`); - break; - } - const data = await response.json(); - if (data && data.data && data.data.length > 0) { - const filteredItems = data.data.filter(entry => isDateWithinLastDays(entry.entries.publishedAt, filterDays)); - allPapersItems.push(...filteredItems.map(entry => ({ - id: entry.entries.id, - url: entry.entries.url, - title: entry.entries.title, - content_html: entry.entries.content, - date_published: entry.entries.publishedAt, - authors: [{ name: entry.entries.author }], - source: `huggingface-papers`, - }))); - publishedAfter = data.data[data.data.length - 1].entries.publishedAt; - } else { - console.log(`No more data for Huggingface Papers, page ${i + 1}.`); - break; - } - } catch (error) { - console.error(`Error fetching Huggingface Papers data, page ${i + 1}:`, error); - break; - } - - // Random wait time between 0 and 5 seconds to avoid rate limiting - await sleep(Math.random() * 5000); - } - - const papersData = { - version: "https://jsonfeed.org/version/1.1", - title: "Huggingface Daily Papers Feeds", - home_page_url: "https://huggingface.co/papers", - description: "Aggregated Huggingface Daily Papers feeds", - language: "zh-cn", - items: allPapersItems - }; - - if (papersData.items.length === 0) { - console.log("No hgpapers found for today or after filtering."); - return papersData; - } - - if (!env.OPEN_TRANSLATE === "true") { - console.warn("Skipping hgpapers translations."); - papersData.items = papersData.items.map(item => ({ - ...item, - title_zh: item.title || "", - content_html_zh: item.content_html || "" - })); - return papersData; - } - - const itemsToTranslate = papersData.items.map((item, index) => ({ - id: index, - original_title: item.title || "" - })); - - const hasContentToTranslate = itemsToTranslate.some(item => item.original_title.trim() !== ""); - if (!hasContentToTranslate) { - console.log("No non-empty hgpapers titles to translate for today's papers."); - papersData.items = papersData.items.map(item => ({ ...item, title_zh: item.title || "", content_html_zh: item.content_html || "" })); - return papersData; - } - - const promptText = `You will be given a JSON array of paper data objects. Each object has an "id" and "original_title". -Translate "original_title" into Chinese. -Return a JSON array of objects. Each output object MUST have: -- "id": The same id from the input. -- "title_zh": Chinese translation of "original_title". Empty if original is empty. -Input: ${JSON.stringify(itemsToTranslate)} -Respond ONLY with the JSON array.`; - - let translatedItemsMap = new Map(); - try { - console.log(`Requesting translation for ${itemsToTranslate.length} hgpapers titles for today.`); - const chatResponse = await callChatAPI(env, promptText); - const parsedTranslations = JSON.parse(removeMarkdownCodeBlock(chatResponse)); // Assuming direct JSON array response - - if (parsedTranslations) { - parsedTranslations.forEach(translatedItem => { - if (translatedItem && typeof translatedItem.id === 'number' && - typeof translatedItem.title_zh === 'string') { - translatedItemsMap.set(translatedItem.id, translatedItem); - } - }); - } - } catch (translationError) { - console.error("Failed to translate hgpapers titles in batch:", translationError.message); - } - - papersData.items = papersData.items.map((originalItem, index) => { - const translatedData = translatedItemsMap.get(index); - return { - ...originalItem, - title_zh: translatedData ? translatedData.title_zh : (originalItem.title || "") - }; - }); - - return papersData; - }, - transform: (papersData,sourceType) => { - const unifiedPapers = []; - if (papersData && Array.isArray(papersData.items)) { - papersData.items.forEach((item, index) => { - unifiedPapers.push({ - id: item.id, // Use item.id from Folo data - type: sourceType, - url: item.url, - title: item.title_zh || item.title, - description: stripHtml(item.content_html || ""), - published_date: item.date_published, - authors: typeof item.authors === 'string' ? item.authors.split(',').map(s => s.trim()) : (item.authors ? item.authors.map(a => a.name) : []), - source: item.source || "Huggingface Papers", // Use existing source or default - details: { - content_html: item.content_html || "" - } - }); - }); - } - return unifiedPapers; - }, - - generateHtml: (item) => { - return ` - ${escapeHtml(item.title)}
- 来源: ${escapeHtml(item.source || '未知')} | 发布日期: ${formatDateToChineseWithTime(item.published_date)} -
- ${item.details.content_html || '无内容。'}
-
- 在 ArXiv/来源 阅读 - `; - } -}; - -export default PapersDataSource; diff --git a/src/dataSources/twitter.js b/src/dataSources/twitter.js deleted file mode 100644 index 806f380..0000000 --- a/src/dataSources/twitter.js +++ /dev/null @@ -1,138 +0,0 @@ -import { getRandomUserAgent, sleep, isDateWithinLastDays, stripHtml, formatDateToChineseWithTime, escapeHtml} from '../helpers'; - -const TwitterDataSource = { - async fetch(env, foloCookie) { - const listId = env.TWITTER_LIST_ID; - const fetchPages = parseInt(env.TWITTER_FETCH_PAGES || '3', 10); - const allTwitterItems = []; - const filterDays = parseInt(env.FOLO_FILTER_DAYS || '3', 10); - - if (!listId) { - console.error('TWITTER_LIST_ID is not set in environment variables.'); - return { - version: "https://jsonfeed.org/version/1.1", - title: "Twitter Feeds", - home_page_url: "https://x.com/", - description: "Aggregated Twitter feeds from various users", - language: "zh-cn", - items: [] - }; - } - - let publishedAfter = null; - for (let i = 0; i < fetchPages; i++) { - const userAgent = getRandomUserAgent(); - const headers = { - 'User-Agent': userAgent, - 'Content-Type': 'application/json', - 'accept': 'application/json', - 'accept-language': 'zh-CN,zh;q=0.9', - 'baggage': 'sentry-environment=stable,sentry-release=5251fa921ef6cbb6df0ac4271c41c2b4a0ce7c50,sentry-public_key=e5bccf7428aa4e881ed5cb713fdff181,sentry-trace_id=2da50ca5ad944cb794670097d876ada8,sentry-sampled=true,sentry-sample_rand=0.06211835167903246,sentry-sample_rate=1', - 'origin': 'https://app.follow.is', - 'priority': 'u=1, i', - 'sec-ch-ua': '"Google Chrome";v="135", "Not-A.Brand";v="8", "Chromium";v="135"', - 'sec-ch-ua-mobile': '?1', - 'sec-ch-ua-platform': '"Android"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-site', - 'x-app-name': 'Folo Web', - 'x-app-version': '0.4.9', - }; - - // 直接使用传入的 foloCookie - if (foloCookie) { - headers['Cookie'] = foloCookie; - } - - const body = { - listId: listId, - view: 1, - withContent: true, - }; - - if (publishedAfter) { - body.publishedAfter = publishedAfter; - } - - try { - console.log(`Fetching Twitter data, page ${i + 1}...`); - const response = await fetch(env.FOLO_DATA_API, { - method: 'POST', - headers: headers, - body: JSON.stringify(body), - }); - - if (!response.ok) { - console.error(`Failed to fetch Twitter data, page ${i + 1}: ${response.statusText}`); - break; - } - const data = await response.json(); - if (data && data.data && data.data.length > 0) { - const filteredItems = data.data.filter(entry => isDateWithinLastDays(entry.entries.publishedAt, filterDays)); - allTwitterItems.push(...filteredItems.map(entry => ({ - id: entry.entries.id, - url: entry.entries.url, - title: entry.entries.title, - content_html: entry.entries.content, - date_published: entry.entries.publishedAt, - authors: [{ name: entry.entries.author }], - source: entry.feeds.title && entry.feeds.title.includes('即刻圈子') ? `${entry.feeds.title} - ${entry.entries.author}` : `twitter-${entry.entries.author}`, - }))); - publishedAfter = data.data[data.data.length - 1].entries.publishedAt; - } else { - console.log(`No more data for Twitter, page ${i + 1}.`); - break; - } - } catch (error) { - console.error(`Error fetching Twitter data, page ${i + 1}:`, error); - break; - } - - // Random wait time between 0 and 5 seconds to avoid rate limiting - await sleep(Math.random() * 5000); - } - - return { - version: "https://jsonfeed.org/version/1.1", - title: "Twitter Feeds", - home_page_url: "https://x.com/", - description: "Aggregated Twitter feeds from various users", - language: "zh-cn", - items: allTwitterItems - }; - }, - - transform(rawData, sourceType) { - if (!rawData || !rawData.items) { - return []; - } - - return rawData.items.map(item => ({ - id: item.id, - type: sourceType, - url: item.url, - title: item.title, - description: stripHtml(item.content_html || ""), - published_date: item.date_published, - authors: item.authors ? item.authors.map(author => author.name).join(', ') : 'Unknown', - source: item.source || 'twitter', // Use existing source or default - details: { - content_html: item.content_html || "" - } - })); - }, - - generateHtml: (item) => { - return ` - ${escapeHtml(item.title)}
- 来源: ${escapeHtml(item.source || '未知')} | 发布日期: ${formatDateToChineseWithTime(item.published_date)} -
- ${item.details.content_html || '无内容。'} -
- 查看推文 - `; - } -}; - -export default TwitterDataSource; diff --git a/src/dataSources/xiaohu.js b/src/dataSources/xiaohu.js deleted file mode 100644 index 8bce4e1..0000000 --- a/src/dataSources/xiaohu.js +++ /dev/null @@ -1,137 +0,0 @@ -import { getRandomUserAgent, sleep, isDateWithinLastDays, stripHtml, formatDateToChineseWithTime, escapeHtml } from '../helpers.js'; - -const XiaohuDataSource = { - fetch: async (env, foloCookie) => { - const feedId = env.XIAOHU_FEED_ID; - const fetchPages = parseInt(env.XIAOHU_FETCH_PAGES || '3', 10); - const allXiaohuItems = []; - const filterDays = parseInt(env.FOLO_FILTER_DAYS || '3', 10); - - if (!feedId) { - console.error('XIAOHU_FEED_ID is not set in environment variables.'); - return { - version: "https://jsonfeed.org/version/1.1", - title: "Xiaohu.AI Daily Feeds", - home_page_url: "https://www.xiaohu.ai", - description: "Aggregated Xiaohu.AI Daily feeds", - language: "zh-cn", - items: [] - }; - } - - let publishedAfter = null; - for (let i = 0; i < fetchPages; i++) { - const userAgent = getRandomUserAgent(); - const headers = { - 'User-Agent': userAgent, - 'Content-Type': 'application/json', - 'accept': 'application/json', - 'accept-language': 'zh-CN,zh;q=0.9', - 'baggage': 'sentry-environment=stable,sentry-release=5251fa921ef6cbb6df0ac4271c41c2b4a0ce7c50,sentry-public_key=e5bccf7428aa4e881ed5cb713fdff181,sentry-trace_id=2da50ca5ad944cb794670097d876ada8,sentry-sampled=true,sentry-sample_rand=0.06211835167903246,sentry-sample_rate=1', - 'origin': 'https://app.follow.is', - 'priority': 'u=1, i', - 'sec-ch-ua': '"Google Chrome";v="135", "Not-A.Brand";v="8", "Chromium";v="135"', - 'sec-ch-ua-mobile': '?1', - 'sec-ch-ua-platform': '"Android"', - 'sec-fetch-dest': 'empty', - 'sec-fetch-mode': 'cors', - 'sec-fetch-site': 'same-site', - 'x-app-name': 'Folo Web', - 'x-app-version': '0.4.9', - }; - - // 直接使用传入的 foloCookie - if (foloCookie) { - headers['Cookie'] = foloCookie; - } - - const body = { - feedId: feedId, - view: 1, - withContent: true, - }; - - if (publishedAfter) { - body.publishedAfter = publishedAfter; - } - - try { - console.log(`Fetching Xiaohu.AI data, page ${i + 1}...`); - const response = await fetch(env.FOLO_DATA_API, { - method: 'POST', - headers: headers, - body: JSON.stringify(body), - }); - - if (!response.ok) { - console.error(`Failed to fetch Xiaohu.AI data, page ${i + 1}: ${response.statusText}`); - break; - } - const data = await response.json(); - if (data && data.data && data.data.length > 0) { - const filteredItems = data.data.filter(entry => isDateWithinLastDays(entry.entries.publishedAt, filterDays)); - allXiaohuItems.push(...filteredItems.map(entry => ({ - id: entry.entries.id, - url: entry.entries.url, - title: entry.entries.title, - content_html: entry.entries.content, - date_published: entry.entries.publishedAt, - authors: [{ name: entry.entries.author }], - source: `xiaohu`, - }))); - publishedAfter = data.data[data.data.length - 1].entries.publishedAt; - } else { - console.log(`No more data for Xiaohu.AI, page ${i + 1}.`); - break; - } - } catch (error) { - console.error(`Error fetching Xiaohu.AI data, page ${i + 1}:`, error); - break; - } - - // Random wait time between 0 and 5 seconds to avoid rate limiting - await sleep(Math.random() * 5000); - } - - return { - version: "https://jsonfeed.org/version/1.1", - title: "Xiaohu.AI Daily Feeds", - home_page_url: "https://www.xiaohu.ai", - description: "Aggregated Xiaohu.AI Daily feeds", - language: "zh-cn", - items: allXiaohuItems - }; - }, - transform: (rawData, sourceType) => { - const unifiedNews = []; - if (rawData && Array.isArray(rawData.items)) { - rawData.items.forEach((item) => { - unifiedNews.push({ - id: item.id, - type: sourceType, - url: item.url, - title: item.title, - description: stripHtml(item.content_html || ""), - published_date: item.date_published, - authors: item.authors ? item.authors.map(a => a.name).join(', ') : 'Unknown', - source: item.source || 'Xiaohu.AI', - details: { - content_html: item.content_html || "" - } - }); - }); - } - return unifiedNews; - }, - - generateHtml: (item) => { - return ` - ${escapeHtml(item.title)}
- 来源: ${escapeHtml(item.source || '未知')} | 发布日期: ${formatDateToChineseWithTime(item.published_date)} -
${item.details.content_html || '无内容。'}
- 阅读更多 - `; - } -}; - -export default XiaohuDataSource; diff --git a/src/github.js b/src/github.js deleted file mode 100644 index e181cbb..0000000 --- a/src/github.js +++ /dev/null @@ -1,90 +0,0 @@ -// src/github.js - -/** - * Generic wrapper for calling the GitHub API. - */ -export async function callGitHubApi(env, path, method = 'GET', body = null) { - const GITHUB_TOKEN = env.GITHUB_TOKEN; - const GITHUB_REPO_OWNER = env.GITHUB_REPO_OWNER; - const GITHUB_REPO_NAME = env.GITHUB_REPO_NAME; - - if (!GITHUB_TOKEN || !GITHUB_REPO_OWNER || !GITHUB_REPO_NAME) { - console.error("GitHub environment variables (GITHUB_TOKEN, GITHUB_REPO_OWNER, GITHUB_REPO_NAME) are not configured."); - throw new Error("GitHub API configuration is missing in environment variables."); - } - - const url = `https://api.github.com/repos/${GITHUB_REPO_OWNER}/${GITHUB_REPO_NAME}${path}`; - const headers = { - 'Authorization': `Bearer ${GITHUB_TOKEN}`, - 'Accept': 'application/vnd.github.v3+json', - 'User-Agent': 'Cloudflare-Worker-ContentBot/1.0' - }; - - if (method !== 'GET' && method !== 'DELETE' && body) { - headers['Content-Type'] = 'application/json'; - } - - const response = await fetch(url, { - method: method, - headers: headers, - body: body ? JSON.stringify(body) : null - }); - - if (!response.ok) { - const errorText = await response.text(); - let errorJsonMessage = errorText; - try { - const errorJson = JSON.parse(errorText); - if (errorJson && errorJson.message) { - errorJsonMessage = errorJson.message; - if (errorJson.errors) { - errorJsonMessage += ` Details: ${JSON.stringify(errorJson.errors)}`; - } - } - } catch (e) { /* Ignore */ } - console.error(`GitHub API Error: ${response.status} ${response.statusText} for ${method} ${url}. Message: ${errorJsonMessage}`); - throw new Error(`GitHub API request to ${path} failed: ${response.status} - ${errorJsonMessage}`); - } - - if (response.status === 204 || response.headers.get("content-length") === "0") { - return null; - } - return response.json(); -} - -/** - * Gets the SHA of a file from GitHub. - */ -export async function getGitHubFileSha(env, filePath) { - const GITHUB_BRANCH = env.GITHUB_BRANCH || 'main'; - try { - const data = await callGitHubApi(env, `/contents/${filePath}?ref=${GITHUB_BRANCH}`); - return data && data.sha ? data.sha : null; - } catch (error) { - if (error.message.includes("404") || error.message.toLowerCase().includes("not found")) { - console.log(`File not found on GitHub: ${filePath} (branch: ${GITHUB_BRANCH})`); - return null; - } - console.error(`Error getting SHA for ${filePath}:`, error); - throw error; - } -} - -/** - * Creates a new file or updates an existing one on GitHub. - */ -export async function createOrUpdateGitHubFile(env, filePath, content, commitMessage, existingSha = null) { - const GITHUB_BRANCH = env.GITHUB_BRANCH || 'main'; - const base64Content = btoa(String.fromCharCode(...new TextEncoder().encode(content))); - - const payload = { - message: commitMessage, - content: base64Content, - branch: GITHUB_BRANCH - }; - - if (existingSha) { - payload.sha = existingSha; - } - return callGitHubApi(env, `/contents/${filePath}`, 'PUT', payload); -} \ No newline at end of file diff --git a/src/handlers/commitToGitHub.js b/src/handlers/commitToGitHub.js deleted file mode 100644 index 0109948..0000000 --- a/src/handlers/commitToGitHub.js +++ /dev/null @@ -1,47 +0,0 @@ -// src/handlers/commitToGitHub.js -import { getISODate, formatMarkdownText } from '../helpers.js'; -import { getGitHubFileSha, createOrUpdateGitHubFile } from '../github.js'; -export async function handleCommitToGitHub(request, env) { - if (request.method !== 'POST') { - return new Response(JSON.stringify({ status: 'error', message: 'Method Not Allowed' }), { status: 405, headers: { 'Content-Type': 'application/json' } }); - } - try { - const formData = await request.formData(); - const dateStr = formData.get('date') || getISODate(); - const dailyMd = formData.get('daily_summary_markdown'); - const podcastMd = formData.get('podcast_script_markdown'); - - const filesToCommit = []; - - if (dailyMd) { - filesToCommit.push({ path: `daily/${dateStr}.md`, content: formatMarkdownText(dailyMd), description: "Daily Summary File" }); - } - if (podcastMd) { - filesToCommit.push({ path: `podcast/${dateStr}.md`, content: podcastMd, description: "Podcast Script File" }); - } - - if (filesToCommit.length === 0) { - throw new Error("No markdown content provided for GitHub commit."); - } - - const results = []; - for (const file of filesToCommit) { - try { - const existingSha = await getGitHubFileSha(env, file.path); - const commitMessage = `${existingSha ? 'Update' : 'Create'} ${file.description.toLowerCase()} for ${dateStr}`; - await createOrUpdateGitHubFile(env, file.path, file.content, commitMessage, existingSha); - results.push({ file: file.path, status: 'Success', message: `Successfully ${existingSha ? 'updated' : 'created'}.` }); - console.log(`GitHub commit success for ${file.path}`); - } catch (err) { - console.error(`Failed to commit ${file.path} to GitHub:`, err); - results.push({ file: file.path, status: 'Failed', message: err.message }); - } - } - - return new Response(JSON.stringify({ status: 'success', date: dateStr, results: results }), { headers: { 'Content-Type': 'application/json; charset=utf-8' } }); - - } catch (error) { - console.error("Error in /commitToGitHub:", error); - return new Response(JSON.stringify({ status: 'error', message: error.message }), { status: 500, headers: { 'Content-Type': 'application/json; charset=utf-8' } }); - } -} diff --git a/src/handlers/genAIContent.js b/src/handlers/genAIContent.js deleted file mode 100644 index 61fee48..0000000 --- a/src/handlers/genAIContent.js +++ /dev/null @@ -1,294 +0,0 @@ -// src/handlers/genAIContent.js -import { getISODate, escapeHtml, stripHtml, removeMarkdownCodeBlock, formatDateToChinese, convertEnglishQuotesToChinese} from '../helpers.js'; -import { getFromKV } from '../kv.js'; -import { callChatAPIStream } from '../chatapi.js'; -import { generateGenAiPageHtml } from '../htmlGenerators.js'; -import { dataSources } from '../dataFetchers.js'; // Import dataSources -import { getSystemPromptSummarizationStepOne } from '../prompt/summarizationPromptStepOne.js'; -import { getSystemPromptSummarizationStepTwo } from '../prompt/summarizationPromptStepTwo.js'; -import { getSystemPromptPodcastFormatting } from '../prompt/podcastFormattingPrompt.js'; -import { getSystemPromptDailyAnalysis } from '../prompt/dailyAnalysisPrompt.js'; // Import new prompt - -export async function handleGenAIPodcastScript(request, env) { - let dateStr; - let selectedItemsParams = []; - let formData; - let outputOfCall1 = null; // This will be the summarized content from Call 1 - - let userPromptPodcastFormattingData = null; - let fullPromptForCall2_System = null; - let fullPromptForCall2_User = null; - let finalAiResponse = null; - - try { - formData = await request.formData(); - dateStr = formData.get('date'); - selectedItemsParams = formData.getAll('selectedItems'); - outputOfCall1 = formData.get('summarizedContent'); // Get summarized content from form data - - if (!outputOfCall1) { - const errorHtml = generateGenAiPageHtml('生成AI播客脚本出错', '

Summarized content is missing. Please go back and generate AI content first.

', dateStr, true, null); - return new Response(errorHtml, { status: 400, headers: { 'Content-Type': 'text/html; charset=utf-8' } }); - } - - userPromptPodcastFormattingData = outputOfCall1; - fullPromptForCall2_System = getSystemPromptPodcastFormatting(env); - fullPromptForCall2_User = userPromptPodcastFormattingData; - - console.log("Call 2 to Chat (Podcast Formatting): User prompt length:", userPromptPodcastFormattingData.length); - try { - let podcastChunks = []; - for await (const chunk of callChatAPIStream(env, userPromptPodcastFormattingData, fullPromptForCall2_System)) { - podcastChunks.push(chunk); - } - finalAiResponse = podcastChunks.join(''); - if (!finalAiResponse || finalAiResponse.trim() === "") throw new Error("Chat podcast formatting call returned empty content."); - finalAiResponse = removeMarkdownCodeBlock(finalAiResponse); // Clean the output - console.log("Call 2 (Podcast Formatting) successful. Final output length:", finalAiResponse.length); - } catch (error) { - console.error("Error in Chat API Call 2 (Podcast Formatting):", error); - const errorHtml = generateGenAiPageHtml('生成AI播客脚本出错(播客文案)', `

Failed during podcast formatting: ${escapeHtml(error.message)}

${error.stack ? `
${escapeHtml(error.stack)}
` : ''}`, dateStr, true, selectedItemsParams, null, null, fullPromptForCall2_System, fullPromptForCall2_User); - return new Response(errorHtml, { status: 500, headers: { 'Content-Type': 'text/html; charset=utf-8' } }); - } - - let promptsMarkdownContent = `# Prompts for ${dateStr}\n\n`; - promptsMarkdownContent += `## Call 2: Podcast Formatting\n\n`; - if (fullPromptForCall2_System) promptsMarkdownContent += `### System Instruction\n\`\`\`\n${fullPromptForCall2_System}\n\`\`\`\n\n`; - if (fullPromptForCall2_User) promptsMarkdownContent += `### User Input (Output of Call 1)\n\`\`\`\n${fullPromptForCall2_User}\n\`\`\`\n\n`; - - let podcastScriptMarkdownContent = `# ${env.PODCAST_TITLE} ${formatDateToChinese(dateStr)}\n\n${removeMarkdownCodeBlock(finalAiResponse)}`; - - const successHtml = generateGenAiPageHtml( - 'AI播客脚本', - escapeHtml(finalAiResponse), - dateStr, false, selectedItemsParams, - null, null, // No Call 1 prompts for this page - fullPromptForCall2_System, fullPromptForCall2_User, - convertEnglishQuotesToChinese(removeMarkdownCodeBlock(promptsMarkdownContent)), - outputOfCall1, // No daily summary for this page - convertEnglishQuotesToChinese(podcastScriptMarkdownContent) - ); - return new Response(successHtml, { headers: { 'Content-Type': 'text/html; charset=utf-8' } }); - - } catch (error) { - console.error("Error in /genAIPodcastScript (outer try-catch):", error); - const pageDateForError = dateStr || getISODate(); - const itemsForActionOnError = Array.isArray(selectedItemsParams) ? selectedItemsParams : []; - const errorHtml = generateGenAiPageHtml('生成AI播客脚本出错', `

Unexpected error: ${escapeHtml(error.message)}

${error.stack ? `
${escapeHtml(error.stack)}
` : ''}`, pageDateForError, true, itemsForActionOnError, null, null, fullPromptForCall2_System, fullPromptForCall2_User); - return new Response(errorHtml, { status: 500, headers: { 'Content-Type': 'text/html; charset=utf-8' } }); - } -} - -export async function handleGenAIContent(request, env) { - let dateStr; - let selectedItemsParams = []; - let formData; - - let userPromptSummarizationData = null; - let fullPromptForCall1_System = null; - let fullPromptForCall1_User = null; - let outputOfCall1 = null; - - try { - formData = await request.formData(); - const dateParam = formData.get('date'); - dateStr = dateParam ? dateParam : getISODate(); - selectedItemsParams = formData.getAll('selectedItems'); - - if (selectedItemsParams.length === 0) { - const errorHtml = generateGenAiPageHtml('生成AI日报出错,未选生成条目', '

No items were selected. Please go back and select at least one item.

', dateStr, true, null); - return new Response(errorHtml, { status: 400, headers: { 'Content-Type': 'text/html; charset=utf-8' } }); - } - - console.log(`Generating AI content for ${selectedItemsParams.length} selected item references from date ${dateStr}`); - - const allFetchedData = {}; - const fetchPromises = []; - for (const sourceType in dataSources) { - if (Object.hasOwnProperty.call(dataSources, sourceType)) { - fetchPromises.push( - getFromKV(env.DATA_KV, `${dateStr}-${sourceType}`).then(data => { - allFetchedData[sourceType] = data || []; - }) - ); - } - } - await Promise.allSettled(fetchPromises); - - const selectedContentItems = []; - let validItemsProcessedCount = 0; - - for (const selection of selectedItemsParams) { - const [type, idStr] = selection.split(':'); - const itemsOfType = allFetchedData[type]; - const item = itemsOfType ? itemsOfType.find(dataItem => String(dataItem.id) === idStr) : null; - - if (item) { - let itemText = ""; - // Dynamically generate itemText based on item.type - // Add new data sources - switch (item.type) { - case 'news': - itemText = `News Title: ${item.title}\nPublished: ${item.published_date}\nContent Summary: ${stripHtml(item.details.content_html)}`; - break; - case 'project': - itemText = `Project Name: ${item.title}\nPublished: ${item.published_date}\nUrl: ${item.url}\nDescription: ${item.description}\nStars: ${item.details.totalStars}`; - break; - case 'paper': - itemText = `Papers Title: ${item.title}\nPublished: ${item.published_date}\nUrl: ${item.url}\nAbstract/Content Summary: ${stripHtml(item.details.content_html)}`; - break; - case 'socialMedia': - itemText = `socialMedia Post by ${item.authors}:Published: ${item.published_date}\nUrl: ${item.url}\nContent: ${stripHtml(item.details.content_html)}`; - break; - default: - // Fallback for unknown types or if more specific details are not available - itemText = `Type: ${item.type}\nTitle: ${item.title || 'N/A'}\nDescription: ${item.description || 'N/A'}\nURL: ${item.url || 'N/A'}`; - if (item.published_date) itemText += `\nPublished: ${item.published_date}`; - if (item.source) itemText += `\nSource: ${item.source}`; - if (item.details && item.details.content_html) itemText += `\nContent: ${stripHtml(item.details.content_html)}`; - break; - } - - if (itemText) { - selectedContentItems.push(itemText); - validItemsProcessedCount++; - } - } else { - console.warn(`Could not find item for selection: ${selection} on date ${dateStr}.`); - } - } - - if (validItemsProcessedCount === 0) { - const errorHtml = generateGenAiPageHtml('生成AI日报出错,可生成条目为空', '

Selected items could not be retrieved or resulted in no content. Please check the data or try different selections.

', dateStr, true, selectedItemsParams); - return new Response(errorHtml, { status: 404, headers: { 'Content-Type': 'text/html; charset=utf-8' } }); - } - - //提示词内不能有英文引号,否则会存储数据缺失。 - fullPromptForCall1_System = getSystemPromptSummarizationStepOne(); - fullPromptForCall1_User = selectedContentItems.join('\n\n---\n\n'); // Keep this for logging/error reporting if needed - - console.log("Call 1 to Chat (Summarization): User prompt length:", fullPromptForCall1_User.length); - try { - const chunkSize = 3; - const summaryPromises = []; - - for (let i = 0; i < selectedContentItems.length; i += chunkSize) { - const chunk = selectedContentItems.slice(i, i + chunkSize); - const chunkPrompt = chunk.join('\n\n---\n\n'); // Join selected items with the separator - - summaryPromises.push((async () => { - let summarizedChunks = []; - for await (const streamChunk of callChatAPIStream(env, chunkPrompt, fullPromptForCall1_System)) { - summarizedChunks.push(streamChunk); - } - return summarizedChunks.join(''); - })()); - } - - const allSummarizedResults = await Promise.all(summaryPromises); - outputOfCall1 = allSummarizedResults.join('\n\n'); // Join all summarized parts - - if (!outputOfCall1 || outputOfCall1.trim() === "") throw new Error("Chat summarization call returned empty content."); - outputOfCall1 = removeMarkdownCodeBlock(outputOfCall1); // Clean the output - console.log("Call 1 (Summarization) successful. Output length:", outputOfCall1.length); - } catch (error) { - console.error("Error in Chat API Call 1 (Summarization):", error); - const errorHtml = generateGenAiPageHtml('生成AI日报出错(分段处理)', `

Failed during summarization: ${escapeHtml(error.message)}

${error.stack ? `
${escapeHtml(error.stack)}
` : ''}`, dateStr, true, selectedItemsParams, fullPromptForCall1_System, fullPromptForCall1_User); - return new Response(errorHtml, { status: 500, headers: { 'Content-Type': 'text/html; charset=utf-8' } }); - } - - // Call 2: Process outputOfCall1 - let outputOfCall2 = null; - let fullPromptForCall2_System = getSystemPromptSummarizationStepTwo(); // Re-using summarization prompt for now - let fullPromptForCall2_User = outputOfCall1; // Input for Call 2 is output of Call 1 - - console.log("Call 2 to Chat (Processing Call 1 Output): User prompt length:", fullPromptForCall2_User.length); - try { - let processedChunks = []; - for await (const chunk of callChatAPIStream(env, fullPromptForCall2_User, fullPromptForCall2_System)) { - processedChunks.push(chunk); - } - outputOfCall2 = processedChunks.join(''); - if (!outputOfCall2 || outputOfCall2.trim() === "") throw new Error("Chat processing call returned empty content."); - outputOfCall2 = removeMarkdownCodeBlock(outputOfCall2); // Clean the output - console.log("Call 2 (Processing Call 1 Output) successful. Output length:", outputOfCall2.length); - } catch (error) { - console.error("Error in Chat API Call 2 (Processing Call 1 Output):", error); - const errorHtml = generateGenAiPageHtml('生成AI日报出错(格式化)', `

Failed during processing of summarized content: ${escapeHtml(error.message)}

${error.stack ? `
${escapeHtml(error.stack)}
` : ''}`, dateStr, true, selectedItemsParams, fullPromptForCall1_System, fullPromptForCall1_User, fullPromptForCall2_System, fullPromptForCall2_User); - return new Response(errorHtml, { status: 500, headers: { 'Content-Type': 'text/html; charset=utf-8' } }); - } - - let promptsMarkdownContent = `# Prompts for ${dateStr}\n\n`; - promptsMarkdownContent += `## Call 1: Content Summarization\n\n`; - if (fullPromptForCall1_System) promptsMarkdownContent += `### System Instruction\n\`\`\`\n${fullPromptForCall1_System}\n\`\`\`\n\n`; - if (fullPromptForCall1_User) promptsMarkdownContent += `### User Input\n\`\`\`\n${fullPromptForCall1_User}\n\`\`\`\n\n`; - promptsMarkdownContent += `## Call 2: Summarized Content Format\n\n`; - if (fullPromptForCall2_System) promptsMarkdownContent += `### System Instruction\n\`\`\`\n${fullPromptForCall2_System}\n\`\`\`\n\n`; - if (fullPromptForCall2_User) promptsMarkdownContent += `### User Input (Output of Call 1)\n\`\`\`\n${fullPromptForCall2_User}\n\`\`\`\n\n`; - - let dailySummaryMarkdownContent = `# ${env.DAILY_TITLE} ${formatDateToChinese(dateStr)}\n\n${removeMarkdownCodeBlock(outputOfCall2)}`; - - const successHtml = generateGenAiPageHtml( - 'AI日报', // Title for Call 1 page - escapeHtml(outputOfCall2), - dateStr, false, selectedItemsParams, - fullPromptForCall1_System, fullPromptForCall1_User, - null, null, // Pass Call 2 prompts - convertEnglishQuotesToChinese(removeMarkdownCodeBlock(promptsMarkdownContent)), - convertEnglishQuotesToChinese(dailySummaryMarkdownContent), - null, // No podcast script for this page - outputOfCall1 // Pass summarized content for the next step (original outputOfCall1) - ); - return new Response(successHtml, { headers: { 'Content-Type': 'text/html; charset=utf-8' } }); - - } catch (error) { - console.error("Error in /genAIContent (outer try-catch):", error); - const pageDateForError = dateStr || getISODate(); - const itemsForActionOnError = Array.isArray(selectedItemsParams) ? selectedItemsParams : []; - const errorHtml = generateGenAiPageHtml('生成AI日报出错', `

Unexpected error: ${escapeHtml(error.message)}

${error.stack ? `
${escapeHtml(error.stack)}
` : ''}`, pageDateForError, true, itemsForActionOnError, fullPromptForCall1_System, fullPromptForCall1_User, fullPromptForCall2_System, fullPromptForCall2_User); - return new Response(errorHtml, { status: 500, headers: { 'Content-Type': 'text/html; charset=utf-8' } }); - } -} - -export async function handleGenAIDailyAnalysis(request, env) { - let dateStr; - let userPromptDailyAnalysisData = ''; - let fullPromptForDailyAnalysis_System = null; - let finalAiResponse = null; - - try { - const requestBody = await request.json(); - dateStr = requestBody.date || getISODate(); - const summarizedContent = requestBody.summarizedContent; // Get summarized content from request body - - if (!summarizedContent || !summarizedContent.trim()) { - return new Response('未提供摘要内容进行分析。', { status: 400, headers: { 'Content-Type': 'text/plain; charset=utf-8' } }); - } - - userPromptDailyAnalysisData = summarizedContent; // Use summarized content as user prompt - - console.log(`Generating AI daily analysis for date: ${dateStr} using summarized content.`); - fullPromptForDailyAnalysis_System = getSystemPromptDailyAnalysis(); - - console.log("Call to Chat (Daily Analysis): User prompt length:", userPromptDailyAnalysisData.length); - try { - let analysisChunks = []; - for await (const chunk of callChatAPIStream(env, userPromptDailyAnalysisData, fullPromptForDailyAnalysis_System)) { - analysisChunks.push(chunk); - } - finalAiResponse = analysisChunks.join(''); - if (!finalAiResponse || finalAiResponse.trim() === "") throw new Error("Chat daily analysis call returned empty content."); - finalAiResponse = removeMarkdownCodeBlock(finalAiResponse); // Clean the output - console.log("Daily Analysis successful. Final output length:", finalAiResponse.length); - } catch (error) { - console.error("Error in Chat API Call (Daily Analysis):", error); - return new Response(`AI 日报分析失败: ${escapeHtml(error.message)}`, { status: 500, headers: { 'Content-Type': 'text/plain; charset=utf-8' } }); - } - - return new Response(finalAiResponse, { headers: { 'Content-Type': 'text/plain; charset=utf-8' } }); - - } catch (error) { - console.error("Error in /genAIDailyAnalysis (outer try-catch):", error); - return new Response(`服务器错误: ${escapeHtml(error.message)}`, { status: 500, headers: { 'Content-Type': 'text/plain; charset=utf-8' } }); - } -} diff --git a/src/handlers/getContent.js b/src/handlers/getContent.js deleted file mode 100644 index cb6721b..0000000 --- a/src/handlers/getContent.js +++ /dev/null @@ -1,36 +0,0 @@ -// src/handlers/getContent.js -import { getISODate } from '../helpers.js'; -import { getFromKV } from '../kv.js'; -import { dataSources } from '../dataFetchers.js'; // Import dataSources - -export async function handleGetContent(request, env) { - const url = new URL(request.url); - const dateParam = url.searchParams.get('date'); - const dateStr = dateParam ? dateParam : getISODate(); - console.log(`Getting content for date: ${dateStr}`); - try { - const responseData = { - date: dateStr, - message: `Successfully retrieved data for ${dateStr}.` - }; - - const fetchPromises = []; - for (const sourceType in dataSources) { - if (Object.hasOwnProperty.call(dataSources, sourceType)) { - fetchPromises.push( - getFromKV(env.DATA_KV, `${dateStr}-${sourceType}`).then(data => { - responseData[sourceType] = data || []; - }) - ); - } - } - await Promise.allSettled(fetchPromises); - - return new Response(JSON.stringify(responseData), { headers: { 'Content-Type': 'application/json' } }); - } catch (error) { - console.error("Error in /getContent:", error); - return new Response(JSON.stringify({ success: false, message: "Failed to get content.", error: error.message, date: dateStr }), { - status: 500, headers: { 'Content-Type': 'application/json' } - }); - } -} diff --git a/src/handlers/getContentHtml.js b/src/handlers/getContentHtml.js deleted file mode 100644 index d3e7b49..0000000 --- a/src/handlers/getContentHtml.js +++ /dev/null @@ -1,31 +0,0 @@ -// src/handlers/getContentHtml.js -import { getISODate, escapeHtml, setFetchDate } from '../helpers.js'; -import { getFromKV } from '../kv.js'; -import { generateContentSelectionPageHtml } from '../htmlGenerators.js'; - -export async function handleGetContentHtml(request, env, dataCategories) { - const url = new URL(request.url); - const dateParam = url.searchParams.get('date'); - const dateStr = dateParam ? dateParam : getISODate(); - setFetchDate(dateStr); - console.log(`Getting HTML content for date: ${dateStr}`); - - try { - const allData = {}; - // Dynamically fetch data for each category based on dataCategories - for (const category of dataCategories) { - allData[category.id] = await getFromKV(env.DATA_KV, `${dateStr}-${category.id}`) || []; - } - - const html = generateContentSelectionPageHtml(env, dateStr, allData, dataCategories); - - return new Response(html, { headers: { 'Content-Type': 'text/html; charset=utf-8' } }); - - } catch (error) { - console.error("Error in /getContentHtml:", error); - // Ensure escapeHtml is used for error messages displayed in HTML - return new Response(`

Error generating HTML content

${escapeHtml(error.message)}

${escapeHtml(error.stack)}
`, { - status: 500, headers: { 'Content-Type': 'text/html; charset=utf-8' } - }); - } -} diff --git a/src/handlers/writeData.js b/src/handlers/writeData.js deleted file mode 100644 index 9b79055..0000000 --- a/src/handlers/writeData.js +++ /dev/null @@ -1,78 +0,0 @@ -// src/handlers/writeData.js -import { getISODate, getFetchDate } from '../helpers.js'; -import { fetchAllData, fetchDataByCategory, dataSources } from '../dataFetchers.js'; // 导入 fetchDataByCategory 和 dataSources -import { storeInKV } from '../kv.js'; - -export async function handleWriteData(request, env) { - const dateParam = getFetchDate(); - const dateStr = dateParam ? dateParam : getISODate(); - console.log(`Starting /writeData process for date: ${dateStr}`); - let category = null; - let foloCookie = null; - - try { - // 尝试解析请求体,获取 category 参数 - if (request.headers.get('Content-Type')?.includes('application/json')) { - const requestBody = await request.json(); - category = requestBody.category; - foloCookie = requestBody.foloCookie; // 获取 foloCookie - } - - console.log(`Starting /writeData process for category: ${category || 'all'} with foloCookie presence: ${!!foloCookie}`); - - let dataToStore = {}; - let fetchPromises = []; - let successMessage = ''; - - if (category) { - // 只抓取指定分类的数据 - const fetchedData = await fetchDataByCategory(env, category, foloCookie); // 传递 foloCookie - dataToStore[category] = fetchedData; - fetchPromises.push(storeInKV(env.DATA_KV, `${dateStr}-${category}`, fetchedData)); - successMessage = `Data for category '${category}' fetched and stored.`; - console.log(`Transformed ${category}: ${fetchedData.length} items.`); - } else { - // 抓取所有分类的数据 (现有逻辑) - const allUnifiedData = await fetchAllData(env, foloCookie); // 传递 foloCookie - - for (const sourceType in dataSources) { - if (Object.hasOwnProperty.call(dataSources, sourceType)) { - dataToStore[sourceType] = allUnifiedData[sourceType] || []; - fetchPromises.push(storeInKV(env.DATA_KV, `${dateStr}-${sourceType}`, dataToStore[sourceType])); - console.log(`Transformed ${sourceType}: ${dataToStore[sourceType].length} items.`); - } - } - successMessage = `All data categories fetched and stored.`; - } - - await Promise.all(fetchPromises); - - const errors = []; // Placeholder for potential future error aggregation from fetchAllData or fetchDataByCategory - - if (errors.length > 0) { - console.warn("/writeData completed with errors:", errors); - return new Response(JSON.stringify({ - success: false, - message: `${successMessage} Some errors occurred.`, - errors: errors, - ...Object.fromEntries(Object.entries(dataToStore).map(([key, value]) => [`${key}ItemCount`, value.length])) - }), { - status: 200, headers: { 'Content-Type': 'application/json' } - }); - } else { - console.log("/writeData process completed successfully."); - return new Response(JSON.stringify({ - success: true, - message: successMessage, - ...Object.fromEntries(Object.entries(dataToStore).map(([key, value]) => [`${key}ItemCount`, value.length])) - }), { - headers: { 'Content-Type': 'application/json' } - }); - } - } catch (error) { - console.error("Unhandled error in /writeData:", error); - return new Response(JSON.stringify({ success: false, message: "An unhandled error occurred during data processing.", error: error.message, details: error.stack }), { - status: 500, headers: { 'Content-Type': 'application/json' } - }); - } -} diff --git a/src/helpers.js b/src/helpers.js deleted file mode 100644 index 0215d6c..0000000 --- a/src/helpers.js +++ /dev/null @@ -1,246 +0,0 @@ -// src/helpers.js - -/** - * 全域參數,用於指定資料抓取的日期。 - * 預設為當前日期,格式為 YYYY-MM-DD。 - */ -export let fetchDate = getISODate(); - -export function setFetchDate(date) { - fetchDate = date; -} - -export function getFetchDate() { - return fetchDate; -} - -/** - * Gets the current date or a specified date in YYYY-MM-DD format. - * @param {Date} [dateObj] - Optional Date object. Defaults to current date. - * @returns {string} Date string in YYYY-MM-DD format. - */ -export function getISODate(dateObj = new Date()) { - const options = { - year: 'numeric', - month: '2-digit', - day: '2-digit', - timeZone: 'Asia/Shanghai' - }; - // 使用 'en-CA' 語言環境,因為它通常會產生 YYYY-MM-DD 格式的日期字串 - const dateString = dateObj.toLocaleDateString('en-CA', options); - return dateString; -} - -/** - * Escapes HTML special characters in a string. - * @param {*} unsafe The input to escape. If not a string, it's converted. Null/undefined become empty string. - * @returns {string} The escaped string. - */ -export function escapeHtml(unsafe) { - if (unsafe === null || typeof unsafe === 'undefined') { - return ''; - } - const str = String(unsafe); - const map = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; - return str.replace(/[&<>"']/g, (m) => map[m]); -} - -/** - * Generic fetch wrapper with JSON parsing and error handling. - * @param {string} url - The URL to fetch. - * @param {object} [options] - Fetch options. - * @returns {Promise} The JSON response or text for non-JSON. - * @throws {Error} If the fetch fails or response is not ok. - */ -export async function fetchData(url, options = {}) { - const response = await fetch(url, options); - if (!response.ok) { - const errorText = await response.text(); - throw new Error(`HTTP error! status: ${response.status}, message: ${errorText}, url: ${url}`); - } - return response.json(); -} - -/** - * Removes markdown code block fences (```json or ```) from a string. - * @param {string} text - The input string potentially containing markdown code fences. - * @returns {string} The string with markdown code fences removed. - */ -export function removeMarkdownCodeBlock(text) { - if (!text) return ''; - let cleanedText = text.trim(); - - const jsonFence = "```json"; - const genericFence = "```"; - - if (cleanedText.startsWith(jsonFence)) { - cleanedText = cleanedText.substring(jsonFence.length); - } else if (cleanedText.startsWith(genericFence)) { - cleanedText = cleanedText.substring(genericFence.length); - } - - if (cleanedText.endsWith(genericFence)) { - cleanedText = cleanedText.substring(0, cleanedText.length - genericFence.length); - } - return cleanedText.trim(); -} - -/** - * Strips HTML tags from a string and normalizes whitespace. - * @param {string} html - The HTML string. - * @returns {string} The text content without HTML tags. - */ -export function stripHtml(html) { - if (!html) return ""; - - // 處理 img 標籤,保留其 src 和 alt 屬性 - let processedHtml = html.replace(/]*src="([^"]*)"[^>]*alt="([^"]*)"[^>]*>/gi, (match, src, alt) => { - return alt ? `[图片: ${alt} ${src}]` : `[图片: ${src}]`; - }); - processedHtml = processedHtml.replace(/]*src="([^"]*)"[^>]*>/gi, '[图片: $1]'); - - // 移除所有其他 HTML 標籤,並正規化空白 - return processedHtml.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim(); -} - -/** - * Checks if a given date string is within the last specified number of days (inclusive of today). - * @param {string} dateString - The date string to check (YYYY-MM-DD). - * @param {number} days - The number of days to look back (e.g., 3 for today and the past 2 days). - * @returns {boolean} True if the date is within the last 'days', false otherwise. - */ -/** - * Converts a date string to a Date object representing the time in Asia/Shanghai timezone. - * This is crucial for consistent date comparisons across different environments. - * @param {string} dateString - The date string to convert. - * @returns {Date} A Date object set to the specified date in Asia/Shanghai timezone. - */ -function convertToShanghaiTime(dateString) { - // Create a Date object from the ISO string. - const date = new Date(dateString); - - // Get the date components in Asia/Shanghai timezone - const options = { - year: 'numeric', - month: 'numeric', - day: 'numeric', - hour: 'numeric', - minute: 'numeric', - second: 'numeric', - hour12: false, - timeZone: 'Asia/Shanghai' - }; - - // Format the date to a string in Shanghai timezone, then parse it back to a Date object. - // This is a common workaround to get a Date object representing a specific timezone. - const shanghaiDateString = new Intl.DateTimeFormat('en-US', options).format(date); - return new Date(shanghaiDateString); -} - -/** - * Checks if a given date string is within the last specified number of days (inclusive of today). - * @param {string} dateString - The date string to check (YYYY-MM-DD or ISO format). - * @param {number} days - The number of days to look back (e.g., 3 for today and the past 2 days). - * @returns {boolean} True if the date is within the last 'days', false otherwise. - */ -export function isDateWithinLastDays(dateString, days) { - // Convert both dates to Shanghai time for consistent comparison - const itemDate = convertToShanghaiTime(dateString); - const today = new Date(fetchDate); - - // Normalize today to the start of its day in Shanghai time - today.setHours(0, 0, 0, 0); - - const diffTime = today.getTime() - itemDate.getTime(); - const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); - - return diffDays >= 0 && diffDays < days; -} - -/** - * Formats an ISO date string to "YYYY年M月D日" format. - * @param {string} isoDateString - The date string in ISO format (e.g., "2025-05-30T08:24:52.000Z"). - * @returns {string} Formatted date string (e.g., "2025年5月30日"). - */ -export function formatDateToChinese(isoDateString) { - if (!isoDateString) return ''; - const date = new Date(isoDateString); - const options = { - year: 'numeric', - month: 'numeric', - day: 'numeric', - timeZone: 'Asia/Shanghai' - }; - return new Intl.DateTimeFormat('zh-CN', options).format(date); -} - -/** - * Formats an ISO date string to "YYYY年M月D日 HH:MM:SS" format. - * @param {string} isoDateString - The date string in ISO format (e.g., "2025-05-30T08:24:52.000Z"). - * @returns {string} Formatted date string (e.g., "2025年5月30日 08:24:52"). - */ -export function formatDateToChineseWithTime(isoDateString) { - if (!isoDateString) return ''; - const date = new Date(isoDateString); - const options = { - year: 'numeric', - month: 'numeric', - day: 'numeric', - hour: '2-digit', - minute: '2-digit', - second: '2-digit', - hour12: false, // 使用24小时制 - timeZone: 'Asia/Shanghai' // 指定东8时区 - }; - // 使用 'zh-CN' 语言环境以确保中文格式 - return new Intl.DateTimeFormat('zh-CN', options).format(date); -} - -/** - * Converts English double quotes (") to Chinese double quotes (“”). - * @param {string} text - The input string. - * @returns {string} The string with Chinese double quotes. - */ -export function convertEnglishQuotesToChinese(text) { - const str = String(text); - return str.replace(/"/g, '“'); -} - -export function formatMarkdownText(text) { - const str = String(text); - return str.replace(/“/g, '"'); -} - -/** - * Generates a random User-Agent string. - * @returns {string} A random User-Agent string. - */ -export function getRandomUserAgent() { - const userAgents = [ - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36", - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15", - "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15", - "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0", - "Mozilla/5.0 (X11; Linux x86_64; rv:108.0) Gecko/20100101 Firefox/108.0", - ]; - return userAgents[Math.floor(Math.random() * userAgents.length)]; -} - -/** - * Pauses execution for a specified number of milliseconds. - * @param {number} ms - The number of milliseconds to sleep. - * @returns {Promise} A promise that resolves after the specified time. - */ -export function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); -} diff --git a/src/htmlGenerators.js b/src/htmlGenerators.js deleted file mode 100644 index e4e443f..0000000 --- a/src/htmlGenerators.js +++ /dev/null @@ -1,499 +0,0 @@ -// src/htmlGenerators.js -import { escapeHtml, formatDateToChinese, convertEnglishQuotesToChinese} from './helpers.js'; -import { dataSources } from './dataFetchers.js'; // Import dataSources - -function generateHtmlListForContentPage(items, dateStr) { - let listHtml = ''; - - if (!Array.isArray(items) || items.length === 0) { - listHtml += `

此日期无可用数据。抓取/筛选过程可能没有为此日期生成任何结果。

`; - return listHtml; - } - - listHtml += '
    '; - items.forEach((item, index) => { - let displayContent = ''; - let itemId = item.id; - - // Use the generateHtml method from the corresponding data source - const dataSourceConfig = dataSources[item.type]; - // console.log("item.type:", item.type); - // console.log("dataSourceConfig:", dataSourceConfig); - if (dataSourceConfig && dataSourceConfig.sources && dataSourceConfig.sources.length > 0 && dataSourceConfig.sources[0].generateHtml) { - displayContent = dataSourceConfig.sources[0].generateHtml(item); - } else { - // Fallback for unknown types or if generateHtml is not defined - displayContent = `未知项目类型: ${escapeHtml(item.type)}
    ${escapeHtml(item.title || item.description || JSON.stringify(item))}`; - } - - listHtml += `
  • - -
  • `; - }); - listHtml += '
'; - return listHtml; -} - -export function generateContentSelectionPageHtml(env, dateStr, allData, dataCategories) { - // Ensure allData is an object and dataCategories is an array - const data = allData || {}; - const categories = Array.isArray(dataCategories) ? dataCategories : []; - - // Generate tab buttons and content dynamically - const tabButtonsHtml = categories.map((category, index) => ` -
- -
- `).join(''); - - const tabContentsHtml = categories.map((category, index) => ` -
- ${generateHtmlListForContentPage(data[category.id], dateStr)} -
- `).join(''); - - return ` - - - - - - ${formatDateToChinese(escapeHtml(dateStr))} ${env.FOLO_FILTER_DAYS}天内的数据 - - - -
-
- -
- -

${formatDateToChinese(escapeHtml(dateStr))} ${env.FOLO_FILTER_DAYS}天内的数据

- -
- -
- ${tabButtonsHtml} -
- ${tabContentsHtml} -
-
- - - - `; -} - - -function generatePromptSectionHtmlForGenAI(systemPrompt, userPrompt, promptTitle, promptIdSuffix) { - if (!systemPrompt && !userPrompt) return ''; - let fullPromptTextForCopy = ""; - if (systemPrompt) fullPromptTextForCopy += `系统指令:\n${systemPrompt}\n\n`; - if (userPrompt) fullPromptTextForCopy += `用户输入:\n${userPrompt}`; - fullPromptTextForCopy = fullPromptTextForCopy.trim(); - - return ` -
-

${escapeHtml(promptTitle)}

- - - -
`; -} - -export function generateGenAiPageHtml(title, bodyContent, pageDate, isErrorPage = false, selectedItemsForAction = null, - systemP1 = null, userP1 = null, systemP2 = null, userP2 = null, - promptsMd = null, dailyMd = null, podcastMd = null) { - - let actionButtonHtml = ''; - // Regenerate button for AI Content Summary page - if (title.includes('AI日报') && selectedItemsForAction && Array.isArray(selectedItemsForAction) && selectedItemsForAction.length > 0) { - actionButtonHtml = ` -
- - ${selectedItemsForAction.map(item => ``).join('')} - -
`; - } - // Regenerate button for AI Podcast Script page - else if (title.includes('AI播客') && selectedItemsForAction && Array.isArray(selectedItemsForAction) && selectedItemsForAction.length > 0) { - actionButtonHtml = ` -
- - ${selectedItemsForAction.map(item => ``).join('')} - - -
`; - } - - let githubSaveFormHtml = ''; - let generatePodcastButtonHtml = ''; - let aiDailyAnalysisButtonHtml = ''; - - // Since commitToGitHub and genAIPodcastScript are now API calls, - // these forms should be handled by JavaScript on the client side. - // We will provide the data as hidden inputs for potential client-side use, - // but the submission will be via JS fetch, not direct form POST. - if (!isErrorPage) { - if (title === 'AI日报' && promptsMd && dailyMd) { - githubSaveFormHtml = ` - - - `; - } else if (title === 'AI播客脚本' && promptsMd && podcastMd) { - githubSaveFormHtml = ` - - - `; - } - } - - if (title === 'AI日报' && !isErrorPage && podcastMd === null) { // podcastMd === null indicates it's the Call 1 page - generatePodcastButtonHtml = ` -
- - ${selectedItemsForAction.map(item => ``).join('')} - - -
`; - aiDailyAnalysisButtonHtml = ` - - - `; - } - - let promptDisplayHtml = ''; - if (title === 'AI日报') { - if (systemP1 || userP1) { - promptDisplayHtml = ` -
-

API 调用详情

- ${generatePromptSectionHtmlForGenAI(convertEnglishQuotesToChinese(systemP1), convertEnglishQuotesToChinese(userP1), '调用 1: 日报', 'call1')} -
`; - } - } else if (title === 'AI播客脚本') { - if (systemP2 || userP2) { - promptDisplayHtml = ` -
-

API 调用详情

- ${generatePromptSectionHtmlForGenAI(convertEnglishQuotesToChinese(systemP2), convertEnglishQuotesToChinese(userP2), '调用 2: 播客格式化', 'call2')} -
`; - } - } - - return ` - - ${escapeHtml(title)} - -
-
-

${escapeHtml(title)}

-
- ${generatePodcastButtonHtml} - ${aiDailyAnalysisButtonHtml} -
-
-

所选内容日期: ${formatDateToChinese(escapeHtml(pageDate))}

-
${bodyContent}
- ${promptDisplayHtml} - -
- - `; -} diff --git a/src/index.js b/src/index.js deleted file mode 100644 index c0b7f7a..0000000 --- a/src/index.js +++ /dev/null @@ -1,102 +0,0 @@ -// src/index.js -import { handleWriteData } from './handlers/writeData.js'; -import { handleGetContent } from './handlers/getContent.js'; -import { handleGetContentHtml } from './handlers/getContentHtml.js'; -import { handleGenAIContent, handleGenAIPodcastScript, handleGenAIDailyAnalysis } from './handlers/genAIContent.js'; // Import handleGenAIPodcastScript and handleGenAIDailyAnalysis -import { handleCommitToGitHub } from './handlers/commitToGitHub.js'; -import { dataSources } from './dataFetchers.js'; // Import dataSources -import { handleLogin, isAuthenticated, handleLogout } from './auth.js'; // Import auth functions - -export default { - async fetch(request, env) { - // Check essential environment variables - const requiredEnvVars = [ - 'DATA_KV', 'GEMINI_API_KEY', 'GEMINI_API_URL', 'DEFAULT_GEMINI_MODEL', 'OPEN_TRANSLATE', 'USE_MODEL_PLATFORM', - 'GITHUB_TOKEN', 'GITHUB_REPO_OWNER', 'GITHUB_REPO_NAME','GITHUB_BRANCH', - 'LOGIN_USERNAME', 'LOGIN_PASSWORD', - 'PODCAST_TITLE','PODCAST_BEGIN','PODCAST_END', - 'FOLO_COOKIE_KV_KEY','FOLO_DATA_API','FOLO_FILTER_DAYS', - 'AIBASE_FEED_ID', 'XIAOHU_FEED_ID', 'HGPAPERS_FEED_ID', 'TWITTER_LIST_ID', - 'AIBASE_FETCH_PAGES', 'XIAOHU_FETCH_PAGES', 'HGPAPERS_FETCH_PAGES', 'TWITTER_FETCH_PAGES', - //'AIBASE_API_URL', 'XIAOHU_API_URL','PROJECTS_API_URL','HGPAPERS_API_URL', 'TWITTER_API_URL', 'TWITTER_USERNAMES', - ]; - console.log(env); - const missingVars = requiredEnvVars.filter(varName => !env[varName]); - - if (missingVars.length > 0) { - console.error(`CRITICAL: Missing environment variables/bindings: ${missingVars.join(', ')}`); - const errorPage = ` - Configuration Error -

Server Configuration Error

-

Essential environment variables or bindings are missing: ${missingVars.join(', ')}. The service cannot operate.

-

Please contact the administrator.

`; - return new Response(errorPage, { status: 503, headers: { 'Content-Type': 'text/html; charset=utf-8' } }); - } - - const url = new URL(request.url); - const path = url.pathname; - console.log(`Request received: ${request.method} ${path}`); - - // Handle login path specifically - if (path === '/login') { - return await handleLogin(request, env); - } else if (path === '/logout') { // Handle logout path - return await handleLogout(request, env); - } else if (path === '/getContent' && request.method === 'GET') { - return await handleGetContent(request, env); - } - - // Authentication check for all other paths - const { authenticated, cookie: newCookie } = await isAuthenticated(request, env); - if (!authenticated) { - // Redirect to login page, passing the original URL as a redirect parameter - const loginUrl = new URL('/login', url.origin); - loginUrl.searchParams.set('redirect', url.pathname + url.search); - return Response.redirect(loginUrl.toString(), 302); - } - - // Original routing logic for authenticated requests - let response; - try { - if (path === '/writeData' && request.method === 'POST') { - response = await handleWriteData(request, env); - } else if (path === '/getContentHtml' && request.method === 'GET') { - // Prepare dataCategories for the HTML generation - const dataCategories = Object.keys(dataSources).map(key => ({ - id: key, - name: dataSources[key].name - })); - response = await handleGetContentHtml(request, env, dataCategories); - } else if (path === '/genAIContent' && request.method === 'POST') { - response = await handleGenAIContent(request, env); - } else if (path === '/genAIPodcastScript' && request.method === 'POST') { // New route for podcast script - response = await handleGenAIPodcastScript(request, env); - } else if (path === '/genAIDailyAnalysis' && request.method === 'POST') { // New route for AI Daily Analysis - response = await handleGenAIDailyAnalysis(request, env); - } else if (path === '/commitToGitHub' && request.method === 'POST') { - response = await handleCommitToGitHub(request, env); - } else { - // const availableEndpoints = [ - // "/writeData (POST) - Fetches, filters, translates, and stores data for today.", - // "/getContent?date=YYYY-MM-DD (GET) - Retrieves stored data as JSON.", - // "/getContentHtml?date=YYYY-MM-DD (GET) - Displays stored data as HTML with selection.", - // "/genAIContent (POST) - Generates summary from selected items. Expects 'date' and 'selectedItems' form data.", - // "/commitToGitHub (POST) - Commits generated content to GitHub. Triggered from /genAIContent result page.", - // "/logout (GET) - Clears the login cookie and redirects." - // ]; - // let responseBody = `Not Found. Available endpoints:\n\n${availableEndpoints.map(ep => `- ${ep}`).join('\n')}\n\nSpecify a date parameter (e.g., ?date=2023-10-27) for content endpoints or they will default to today.`; - // return new Response(responseBody, { status: 404, headers: {'Content-Type': 'text/plain; charset=utf-8'} }); - return new Response(null, { status: 404, headers: {'Content-Type': 'text/plain; charset=utf-8'} }); - } - } catch (e) { - console.error("Unhandled error in fetch handler:", e); - return new Response(`Internal Server Error: ${e.message}`, { status: 500 }); - } - - // Renew cookie for authenticated requests - if (newCookie) { - response.headers.append('Set-Cookie', newCookie); - } - return response; - } -}; diff --git a/src/kv.js b/src/kv.js deleted file mode 100644 index 6924c42..0000000 --- a/src/kv.js +++ /dev/null @@ -1,12 +0,0 @@ -// src/kv.js - -export async function storeInKV(kvNamespace, key, value, expirationTtl = 86400 * 7) { // 7 days default - console.log(`Storing data in KV with key: ${key}`); - await kvNamespace.put(key, JSON.stringify(value), { expirationTtl }); -} - -export async function getFromKV(kvNamespace, key) { - console.log(`Retrieving data from KV with key: ${key}`); - const value = await kvNamespace.get(key); - return value ? JSON.parse(value) : null; -} \ No newline at end of file diff --git a/src/prompt/dailyAnalysisPrompt.js b/src/prompt/dailyAnalysisPrompt.js deleted file mode 100644 index 1aaf832..0000000 --- a/src/prompt/dailyAnalysisPrompt.js +++ /dev/null @@ -1,37 +0,0 @@ -export function getSystemPromptDailyAnalysis() { - return ` - 请您扮演一位拥有10年以上经验的资深AI行业分析师。 - 您的任务是针对下方提供的AI相关内容(可能包括但不限于AI领域的新闻报道、学术论文摘要或全文、社会热点现象讨论、社交媒体上的关键意见、或开源项目的技术文档/介绍)进行一次深入、专业且全面的分析。 - 您的分析报告应力求正式、客观、并带有批判性视角,同时不失前瞻性和深刻洞察力。 - 请将您的分析结果组织成一份结构清晰的报告,至少包含以下核心部分。在每个部分中,请用精炼的语言阐述关键洞察,可适当使用分点进行表述: - AI内容分析报告 - 核心内容摘要与AI相关性解读: - 简明扼要地总结所提供内容的核心信息。 - 明确指出该内容与人工智能领域的关联性,及其探讨的AI核心要素。 - 技术创新性与可行性评估: - 创新性分析: 评估内容中所涉及的AI技术、算法、模型或概念的新颖程度和独特性。是现有技术的迭代改进,还是颠覆性的创新? - 技术可行性: 分析所讨论的技术在当前技术水平下实现的可能性、成熟度、技术壁垒以及规模化应用的潜在挑战。 - 市场潜力与商业模式洞察: - 分析其可能开拓的市场空间、目标用户群体及其规模。 - 探讨其潜在的商业化路径、可能的盈利模式及其可持续性。 - 对现有行业格局的影响评估: - 分析该内容所揭示的技术或趋势可能对当前AI行业格局、相关产业链上下游以及市场竞争态势带来哪些具体影响或改变(例如,重塑竞争格局、催生新赛道、淘汰旧技术等)。 - 潜在风险与核心挑战识别: - 指出该技术、现象或项目在发展、推广和应用过程中可能面临的主要技术瓶颈、市场接受度风险、数据安全与隐私问题、成本效益问题、以及潜在的政策法规监管挑战。 - 伦理与社会影响深思: - 深入探讨其可能引发的伦理问题(如算法偏见、透明度缺失、问责机制、对就业市场的影响、数字鸿沟等)。 - 分析其对社会结构、人类行为模式、社会公平性及公共福祉可能产生的广泛而深远的影响。 - 与其他AI技术/公司/项目的对比分析 (如适用): - 如果内容涉及具体的技术、产品、公司或项目,请将其与行业内现有或相似的AI技术、解决方案或市场参与者进行对比。 - 明确指出其差异化特征、核心竞争力、潜在优势及相对劣势。 - 未来发展趋势预测与展望: - 基于当前的分析,预测其在未来3-5年内的发展方向、技术演进路径、可能的应用场景拓展以及对整个AI领域未来走向的启示。 - 探讨其是否可能成为未来的主流趋势或关键技术节点。 - 综合结论与战略洞察: - 对分析对象给出一个整体性的评价。 - 提炼出最具价值的战略洞察或关键结论,供决策参考。 - 请确保您的分析逻辑严谨,论据充分(可基于提供内容本身或您作为资深分析师的行业认知),并体现出专业AI行业分析师的深度与广度。 - 确保全文使用简体中文语言输出。 - 请将您需要分析的AI相关内容粘贴在下方: - `; -} diff --git a/src/prompt/podcastFormattingPrompt.js b/src/prompt/podcastFormattingPrompt.js deleted file mode 100644 index f2a7e54..0000000 --- a/src/prompt/podcastFormattingPrompt.js +++ /dev/null @@ -1,23 +0,0 @@ -// Add new data sources -export function getSystemPromptPodcastFormatting(env) { - return ` - 你是一位经验丰富的播客脚本撰写人和编辑。你的任务是根据收到的内容改编成一个引人入胜的单人播客脚本。 - 重要原则:所有脚本内容必须严格基于提供的原始内容。不得捏造、歪曲或添加摘要中未包含的信息。 - 播客脚本要求: - 开场白结束语:固定的开场白:“${env.PODCAST_BEGIN}”,并以固定的结束语结束:“${env.PODCAST_END}”。 - 目标受众和基调:目标受众是上班族和对人工智能感兴趣的人群。整体基调应轻松幽默,同时融入对未来的反思和对技术创新潜在影响的警示。特别注意:避免使用过于夸张或耸人听闻的词语(例如,“炸裂”、“震惊”、“令人兴奋的”、“改变游戏规则的”等)以及可能制造不必要焦虑的表达方式。保持积极和建设性的基调。 - 内容风格: - 要有包袱有段子,像听徐志胜在讲脱口秀。 - 将原始副本转化为自然、口语化的表达,就像与听众聊天一样。 - 时长:改编后的脚本内容应适合5分钟以内的口播时长。在改编过程中,请注意适当的细节和简洁性,以适应此时长要求。输入的摘要会相对较短,因此请专注于将其自然地扩展成单口式的脚本。 - 结尾处理: - 在根据所提供摘要编写的播客脚本主体内容之后,从你处理的原始摘要中提取核心关键词和高频词。 - 在脚本末尾以“本期关键词:”为标题单独列出这些关键词。对于所有单词,请在单词前加上“#”符号。 - 输出格式: - 请直接输出完整的播客脚本。这包括: - 固定的开场白结束语。 - 主要内容(口语化处理的摘要)。 - 结尾处的关键词列表。 - 不要包含任何其他解释性文字。 - `; -} diff --git a/src/prompt/summarizationPromptStepOne.js b/src/prompt/summarizationPromptStepOne.js deleted file mode 100644 index 8f02e77..0000000 --- a/src/prompt/summarizationPromptStepOne.js +++ /dev/null @@ -1,16 +0,0 @@ -// Add new data sources -export function getSystemPromptSummarizationStepOne() { - return ` - 你是一名专业的文本摘要助理。你的任务是根据收到的文本类型(或其包含的多种内容类型)执行特定类型的摘要。 - - 重要通用原则:所有摘要内容必须严格来源于原文。不得捏造、歪曲或添加原文未提及的信息。 - - **最终输出要求:** - * 通俗易懂:用简单的语言解释,避免使用专业术语。如果必须提及某个概念,尝试使用日常生活的例子或类比来帮助理解。 - * 流畅自然:确保语句通顺自然。 - * 生动有趣/引人入胜:擅长将复杂科技问题用幽默方式拆解,并引导观众进行批判性思考。也要有对技术发展方向、利弊的深刻反思和独到见解。风格要既活泼又不失深度,但要避免使用过于晦涩的网络俚语或不当词汇。 - * 仅输出最终生成的摘要。不要包含任何关于你如何分析文本、确定其类型、分割文本或应用规则的解释性文字。如果合并了来自多个片段的摘要,请确保合并后的文本流畅自然。 - * 输出语言与格式:内容必须为简体中文,并严格采用 Markdown 格式进行排版。 - * 关键词高亮:请在内容中自动识别并对核心关键词或重要概念进行加黑加粗处理,以增强可读性和重点突出。 - `; -} diff --git a/src/prompt/summarizationPromptStepTwo.js b/src/prompt/summarizationPromptStepTwo.js deleted file mode 100644 index fd7a631..0000000 --- a/src/prompt/summarizationPromptStepTwo.js +++ /dev/null @@ -1,15 +0,0 @@ -// Add new data sources -export function getSystemPromptSummarizationStepTwo() { - return ` - 你是一名专业的文本摘要助理。你的任务是根据收到的文本类型(或其包含的多种内容类型)执行特定类型的摘要。 - - 重要通用原则:所有摘要内容必须严格来源于原文。不得捏造、歪曲或添加原文未提及的信息。 - - **最终输出要求:** - * 参照以上条件优化文本内容,按内容自动分段,段落数量要和原始一样,然后按照“AI产品与功能更新,AI前沿研究,AI行业展望与社会影响,科技博主观点, 开源TOP项目, 社媒分享“的顺序重新分类,增加分类标题(只加大加粗加黑),排序。 - * 仅输出最终生成的摘要。不要包含任何关于你如何分析文本、确定其类型、分割文本或应用规则的解释性文字。如果合并了来自多个片段的摘要,请确保合并后的文本流畅自然。 - * 输出语言与格式:内容必须为简体中文,并严格采用 Markdown 格式进行排版。 - * 关键词高亮:请在内容中自动识别并对核心关键词或重要概念进行加黑加粗处理,以增强可读性和重点突出。 - * 段落序列化:在每个独立段落的开头,必须添加以“1.”开头的阿拉伯数字序列,确保数字正确递增(例如,1.、2.、3.、...)。 - `; -} diff --git a/today/archive.tar.gz b/today/archive.tar.gz new file mode 100644 index 0000000..4ceded2 Binary files /dev/null and b/today/archive.tar.gz differ diff --git a/today/book/2025-06-11.html b/today/book/2025-06-11.html new file mode 100644 index 0000000..0462385 --- /dev/null +++ b/today/book/2025-06-11.html @@ -0,0 +1,266 @@ + + + + + + Today - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025/6/11

+

AI产品与功能更新

+
    +
  1. 豆包大模型家族将在2025 FORCE原动力大会上,重磅发布全新的豆包·视频生成模型。这款模型可谓"创意魔法棒”,它凭借高效结构和多任务统一建模等黑科技,不仅支持无缝多镜头叙事,还能精准响应多动作,甚至能像专业摄影师一样随心运镜,轻松生成写实、动漫等多种风格的高品质视频,简直是视频创作者的福音! +
    图片
  2. +
  3. xAI开发的Grok人工智能正大刀阔斧地接管X平台的推荐算法,同时优化了评论排序机制。这意味着,平台将优先推荐高质量内容,而非仅仅看粉丝量,这无疑给那些粉丝较少但有真材实料的"小号”和新人带来了前所未有的曝光机会,旨在打造一个更公平、更开放的内容生态,让好内容不再"蒙尘”。 +
    图片
  4. +
  5. 豆包App近期也对"一句话P图”功能进行了全面升级,它基于强大的SeedEdit 3.0模型,新增了一键添加/替换文字、质感风格迁移和局部图像编辑增强等一系列酷炫修图玩法。这波升级简直是把专业修图师请进了手机,让普通用户也能无需专业技能,轻松搞定个性化照片创作,让"修图小白”也能变身"修图大师”。 +
    图片
  6. +
  7. 苹果在WWDC 2025大会上带来了iOS 26系统的"杀手级”功能——视觉智能。有了它,你可以在屏幕上的任何图片或信息上进行提问、搜索,甚至自动识别事件详情,简直是手机的"智能眼”。这项升级通过AI技术实现了屏幕内容的"一眼识别”,大大提升了交互体验的便捷性与智能化程度,还能自动提取事件信息加入日历,让你的数字生活更加省心。 +
    图片
  8. +
  9. 好消息!沉浸式翻译迎来重大更新,现在已能对推特(X)视频进行实时翻译。即便视频没有原生字幕,它也能帮你"神同步”地显示中英双语字幕。这下,刷X平台视频再也不用担心语言不通了,简直是跨文化交流的"神助攻”,彻底消除了语言障碍,让世界更近。 +Link
  10. +
+

AI前沿研究

+
    +
  1. 香港大学和华为诺亚方舟实验室强强联手,推出了颠覆性的FUDOKI模型。这款模型采用非掩码离散流匹配架构,成功突破了传统自回归模型的束缚,实现了更加灵活高效的多模态生成与理解能力。它通过独特的并行去噪机制,显著提升了复杂推理和生成任务的表现,尤其在图像生成方面表现惊艳,为未来通用人工智能的发展铺平了道路。 +
    图片
  2. +
  3. 香港科技大学和快手科技的研究团队联合发布了EvoSearch(进化搜索)技术,这简直是AI作画领域的一股清流!它彻底颠覆了以往"大模型、大算力”的固有思维,巧妙地将达尔文的进化论思想融入AI生成过程,让那些"小个子”模型也能生成超越甚至媲美"大块头”的高质量图像和视频。这项突破性技术有望开启AI创作的**"智能进化”时代**,让AI模型在推理阶段释放更深层次的潜力。相关项目主页、代码和论文链接已发布:https://tinnerhrhe.github.io/evosearch/https://github.com/tinnerhrhe/EvoSearch-codeshttps://arxiv.org/abs/2505.17618。 +
    图片
    +
    图片
  4. +
  5. 一篇名为"玩中泛化:通过游戏学习推理”的学术论文揭示了令人兴奋的发现:多模态大型语言模型(MLLMs)通过玩简单的街机游戏,竟然能显著提升其跨领域的多模态推理能力,甚至超越了在特定数据上训练的专业模型!这无疑为未来通用AI能力的培养指明了一条充满趣味的新方向,让AI在"玩乐”中变得更聪明。 +此链接
  6. +
  7. 新论文《梦境之地》(Dreamland)提出了一种结合物理模拟器与大型生成模型的混合框架。它的目标是创造出高度可控且逼真的动态虚拟世界,不仅显著提升了图像质量与可控性,更重要的是,有望为具身AI智能体的训练提供一个理想的"游乐场”和"实验室”,助力AI在现实世界中更好地学习和行动。 +Link
  8. +
+

AI行业展望与社会影响

+
    +
  1. 理想汽车近期进行了组织架构的"大变身”,正式成立了**"空间机器人”"穿戴机器人”两个全新的二级部门。这不仅仅是部门调整,更预示着理想汽车正从传统的汽车制造商转型为智能出行生态构建者**。他们旨在通过机器人技术,构建一个涵盖车内"第三空间”和车外智能穿戴设备的完整智能生活服务体系,这无疑将为理想汽车在竞争激烈的市场中带来新的差异化优势,让"第三空间”战略不再只是一个概念。 +
    理想汽车
  2. +
  3. 俄亥俄州立大学宣布从今年起,将强制所有学生接受人工智能(AI)培训,这简直是为未来职场"量身定制”的技能包!学校推出了**"AI流利度”计划**,将AI教育全面融入本科生课程,旨在培养学生将专业知识与AI技术有效结合的能力。当然,学校也强调学生不得利用生成性AI来"蒙混过关”,同时加强教师培训以维护学术诚信。此举旨在确保每位毕业生都能在其专业领域有效应用AI,并积极响应俄亥俄州AI教育联盟在K-12教育中推动AI教育的努力,让AI真正成为每个人的"超级助手”。 +
    学习 考试 高考 教育 (1)
  4. +
  5. 知名思考者李继刚一针见血地指出,当AI技术变得越发高效强大时,人类的判断力品味和对事物目的的理解反而会变得更为硬核。因为AI虽然能生成万千方案并完美执行,却无法替代人类进行选择、定义,更无法洞悉复杂且深邃的人性。这提醒我们,在AI时代,真正有价值的,或许正是那些AI无法企及的"人类专属技能”。 +Link
  6. +
+

开源TOP项目

+
    +
  1. 小红书的 hi lab 团队近日献出了一份"大礼”——首个开源文本大模型dots.llm1!这款拥有1420亿参数的混合专家(MoE)语言模型,在海量真实数据训练后,其性能竟然能媲美阿里巴巴的Qwen2.5-72B,这简直是模型界的"黑马”!此次开源不仅彰显了小红书在人工智能领域的技术雄心,更旨在提供更智能化的服务,并激励开发者们一起加入AI研究的"大合唱”。 +
    图片
  2. +
  3. 近期,GitHub上两个AI相关的项目人气爆棚。其中,拥有10785星的"newsnow”项目,它旨在为用户提供优雅的实时热点新闻阅读体验,让信息获取既便捷又高效,简直是"新闻控”的福音,地址在这里:此链接。另一个是"GenAI_Agents”项目,以12884星的高热度,为开发者提供了从基础到高级的生成式AI智能体技术教程与实现,旨在赋能构建更智能的交互式AI系统,详情可访问:此链接
  4. +
+

社媒分享

+
    +
  1. Gorden Sun在社交媒体上分享了Mirage虚拟人模型产品,这款产品简直是"数字分身”的魔法师!它能通过音频驱动,生成生动、嘴型同步且表情丰富的虚拟人视频,栩栩如生。Gorden Sun还特别强调,该产品的详细技术报告对研究人员具有极高的参考价值,看来又将引发一场虚拟人技术的"军备竞赛”。 +Link
  2. +
  3. Sam Altman在X平台发文宣布,o3产品价格已大幅下调80%,这简直是"福利大放送”!他表达了对用户创新使用的期待,并预告了o3-pro版本也将提供令人满意的定价。看来,Sora之父又在鼓励大家放开手脚,用更低的成本去探索AI的无限可能了。 +Link
  4. +
  5. Ryan ᵐᶠᵉʳ 🦄d/acc抛出了一个关于下一代创业者的深刻观点:他们不应被束缚于模仿乔布斯等前代成功模式,也不应受限于有限的低质量输入,而应忠于自我,以独特的"vibe”和玩乐精神自由探索。这就像在说,别做别人的影子,去创造属于你自己的"游戏规则”! +Link
  6. +
  7. 用户wwwgoubuli分享了AI在实际工作中的一个有趣转变。他提到,远程团队成员初时因担心被视为偷懒而不敢充分使用AI,但在他多次分享AI"正确用法”后,团队逐渐"放开手脚”,结果代码的注释、规范和质量均显著提升,同事们也展现出更高的自信。这简直是AI赋能团队效率提升的"教科书式”案例,打破了心中的"AI焦虑”。 +Link
  8. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/404.html b/today/book/404.html new file mode 100644 index 0000000..49decdd --- /dev/null +++ b/today/book/404.html @@ -0,0 +1,211 @@ + + + + + + Page not found - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

Document not found (404)

+

This URL is invalid, sorry. Please use the navigation bar or search to continue.

+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/FontAwesome/css/font-awesome.css b/today/book/FontAwesome/css/font-awesome.css new file mode 100644 index 0000000..540440c --- /dev/null +++ b/today/book/FontAwesome/css/font-awesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/today/book/FontAwesome/fonts/FontAwesome.ttf b/today/book/FontAwesome/fonts/FontAwesome.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/today/book/FontAwesome/fonts/FontAwesome.ttf differ diff --git a/today/book/FontAwesome/fonts/fontawesome-webfont.eot b/today/book/FontAwesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/today/book/FontAwesome/fonts/fontawesome-webfont.eot differ diff --git a/today/book/FontAwesome/fonts/fontawesome-webfont.svg b/today/book/FontAwesome/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/today/book/FontAwesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/today/book/FontAwesome/fonts/fontawesome-webfont.ttf b/today/book/FontAwesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/today/book/FontAwesome/fonts/fontawesome-webfont.ttf differ diff --git a/today/book/FontAwesome/fonts/fontawesome-webfont.woff b/today/book/FontAwesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/today/book/FontAwesome/fonts/fontawesome-webfont.woff differ diff --git a/today/book/FontAwesome/fonts/fontawesome-webfont.woff2 b/today/book/FontAwesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/today/book/FontAwesome/fonts/fontawesome-webfont.woff2 differ diff --git a/today/book/ayu-highlight.css b/today/book/ayu-highlight.css new file mode 100644 index 0000000..32c9432 --- /dev/null +++ b/today/book/ayu-highlight.css @@ -0,0 +1,78 @@ +/* +Based off of the Ayu theme +Original by Dempfi (https://github.com/dempfi/ayu) +*/ + +.hljs { + display: block; + overflow-x: auto; + background: #191f26; + color: #e6e1cf; +} + +.hljs-comment, +.hljs-quote { + color: #5c6773; + font-style: italic; +} + +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-regexp, +.hljs-link, +.hljs-selector-id, +.hljs-selector-class { + color: #ff7733; +} + +.hljs-number, +.hljs-meta, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #ffee99; +} + +.hljs-string, +.hljs-bullet { + color: #b8cc52; +} + +.hljs-title, +.hljs-built_in, +.hljs-section { + color: #ffb454; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-symbol { + color: #ff7733; +} + +.hljs-name { + color: #36a3d9; +} + +.hljs-tag { + color: #00568d; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #91b362; +} + +.hljs-deletion { + color: #d96c75; +} diff --git a/today/book/book.js b/today/book/book.js new file mode 100644 index 0000000..5df2096 --- /dev/null +++ b/today/book/book.js @@ -0,0 +1,818 @@ +'use strict'; + +/* global default_theme, default_dark_theme, default_light_theme, hljs, ClipboardJS */ + +// Fix back button cache problem +window.onunload = function() { }; + +// Global variable, shared between modules +function playground_text(playground, hidden = true) { + const code_block = playground.querySelector('code'); + + if (window.ace && code_block.classList.contains('editable')) { + const editor = window.ace.edit(code_block); + return editor.getValue(); + } else if (hidden) { + return code_block.textContent; + } else { + return code_block.innerText; + } +} + +(function codeSnippets() { + function fetch_with_timeout(url, options, timeout = 6000) { + return Promise.race([ + fetch(url, options), + new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)), + ]); + } + + const playgrounds = Array.from(document.querySelectorAll('.playground')); + if (playgrounds.length > 0) { + fetch_with_timeout('https://play.rust-lang.org/meta/crates', { + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + mode: 'cors', + }) + .then(response => response.json()) + .then(response => { + // get list of crates available in the rust playground + const playground_crates = response.crates.map(item => item['id']); + playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); + }); + } + + function handle_crate_list_update(playground_block, playground_crates) { + // update the play buttons after receiving the response + update_play_button(playground_block, playground_crates); + + // and install on change listener to dynamically update ACE editors + if (window.ace) { + const code_block = playground_block.querySelector('code'); + if (code_block.classList.contains('editable')) { + const editor = window.ace.edit(code_block); + editor.addEventListener('change', () => { + update_play_button(playground_block, playground_crates); + }); + // add Ctrl-Enter command to execute rust code + editor.commands.addCommand({ + name: 'run', + bindKey: { + win: 'Ctrl-Enter', + mac: 'Ctrl-Enter', + }, + exec: _editor => run_rust_code(playground_block), + }); + } + } + } + + // updates the visibility of play button based on `no_run` class and + // used crates vs ones available on https://play.rust-lang.org + function update_play_button(pre_block, playground_crates) { + const play_button = pre_block.querySelector('.play-button'); + + // skip if code is `no_run` + if (pre_block.querySelector('code').classList.contains('no_run')) { + play_button.classList.add('hidden'); + return; + } + + // get list of `extern crate`'s from snippet + const txt = playground_text(pre_block); + const re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; + const snippet_crates = []; + let item; + // eslint-disable-next-line no-cond-assign + while (item = re.exec(txt)) { + snippet_crates.push(item[1]); + } + + // check if all used crates are available on play.rust-lang.org + const all_available = snippet_crates.every(function(elem) { + return playground_crates.indexOf(elem) > -1; + }); + + if (all_available) { + play_button.classList.remove('hidden'); + } else { + play_button.classList.add('hidden'); + } + } + + function run_rust_code(code_block) { + let result_block = code_block.querySelector('.result'); + if (!result_block) { + result_block = document.createElement('code'); + result_block.className = 'result hljs language-bash'; + + code_block.append(result_block); + } + + const text = playground_text(code_block); + const classes = code_block.querySelector('code').classList; + let edition = '2015'; + classes.forEach(className => { + if (className.startsWith('edition')) { + edition = className.slice(7); + } + }); + const params = { + version: 'stable', + optimize: '0', + code: text, + edition: edition, + }; + + if (text.indexOf('#![feature') !== -1) { + params.version = 'nightly'; + } + + result_block.innerText = 'Running...'; + + fetch_with_timeout('https://play.rust-lang.org/evaluate.json', { + headers: { + 'Content-Type': 'application/json', + }, + method: 'POST', + mode: 'cors', + body: JSON.stringify(params), + }) + .then(response => response.json()) + .then(response => { + if (response.result.trim() === '') { + result_block.innerText = 'No output'; + result_block.classList.add('result-no-output'); + } else { + result_block.innerText = response.result; + result_block.classList.remove('result-no-output'); + } + }) + .catch(error => result_block.innerText = 'Playground Communication: ' + error.message); + } + + // Syntax highlighting Configuration + hljs.configure({ + tabReplace: ' ', // 4 spaces + languages: [], // Languages used for auto-detection + }); + + const code_nodes = Array + .from(document.querySelectorAll('code')) + // Don't highlight `inline code` blocks in headers. + .filter(function(node) { + return !node.parentElement.classList.contains('header'); + }); + + if (window.ace) { + // language-rust class needs to be removed for editable + // blocks or highlightjs will capture events + code_nodes + .filter(function(node) { + return node.classList.contains('editable'); + }) + .forEach(function(block) { + block.classList.remove('language-rust'); + }); + + code_nodes + .filter(function(node) { + return !node.classList.contains('editable'); + }) + .forEach(function(block) { + hljs.highlightBlock(block); + }); + } else { + code_nodes.forEach(function(block) { + hljs.highlightBlock(block); + }); + } + + // Adding the hljs class gives code blocks the color css + // even if highlighting doesn't apply + code_nodes.forEach(function(block) { + block.classList.add('hljs'); + }); + + Array.from(document.querySelectorAll('code.hljs')).forEach(function(block) { + + const lines = Array.from(block.querySelectorAll('.boring')); + // If no lines were hidden, return + if (!lines.length) { + return; + } + block.classList.add('hide-boring'); + + const buttons = document.createElement('div'); + buttons.className = 'buttons'; + buttons.innerHTML = ''; + + // add expand button + const pre_block = block.parentNode; + pre_block.insertBefore(buttons, pre_block.firstChild); + + pre_block.querySelector('.buttons').addEventListener('click', function(e) { + if (e.target.classList.contains('fa-eye')) { + e.target.classList.remove('fa-eye'); + e.target.classList.add('fa-eye-slash'); + e.target.title = 'Hide lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.remove('hide-boring'); + } else if (e.target.classList.contains('fa-eye-slash')) { + e.target.classList.remove('fa-eye-slash'); + e.target.classList.add('fa-eye'); + e.target.title = 'Show hidden lines'; + e.target.setAttribute('aria-label', e.target.title); + + block.classList.add('hide-boring'); + } + }); + }); + + if (window.playground_copyable) { + Array.from(document.querySelectorAll('pre code')).forEach(function(block) { + const pre_block = block.parentNode; + if (!pre_block.classList.contains('playground')) { + let buttons = pre_block.querySelector('.buttons'); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + const clipButton = document.createElement('button'); + clipButton.className = 'clip-button'; + clipButton.title = 'Copy to clipboard'; + clipButton.setAttribute('aria-label', clipButton.title); + clipButton.innerHTML = ''; + + buttons.insertBefore(clipButton, buttons.firstChild); + } + }); + } + + // Process playground code blocks + Array.from(document.querySelectorAll('.playground')).forEach(function(pre_block) { + // Add play button + let buttons = pre_block.querySelector('.buttons'); + if (!buttons) { + buttons = document.createElement('div'); + buttons.className = 'buttons'; + pre_block.insertBefore(buttons, pre_block.firstChild); + } + + const runCodeButton = document.createElement('button'); + runCodeButton.className = 'fa fa-play play-button'; + runCodeButton.hidden = true; + runCodeButton.title = 'Run this code'; + runCodeButton.setAttribute('aria-label', runCodeButton.title); + + buttons.insertBefore(runCodeButton, buttons.firstChild); + runCodeButton.addEventListener('click', () => { + run_rust_code(pre_block); + }); + + if (window.playground_copyable) { + const copyCodeClipboardButton = document.createElement('button'); + copyCodeClipboardButton.className = 'clip-button'; + copyCodeClipboardButton.innerHTML = ''; + copyCodeClipboardButton.title = 'Copy to clipboard'; + copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); + + buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); + } + + const code_block = pre_block.querySelector('code'); + if (window.ace && code_block.classList.contains('editable')) { + const undoChangesButton = document.createElement('button'); + undoChangesButton.className = 'fa fa-history reset-button'; + undoChangesButton.title = 'Undo changes'; + undoChangesButton.setAttribute('aria-label', undoChangesButton.title); + + buttons.insertBefore(undoChangesButton, buttons.firstChild); + + undoChangesButton.addEventListener('click', function() { + const editor = window.ace.edit(code_block); + editor.setValue(editor.originalCode); + editor.clearSelection(); + }); + } + }); +})(); + +(function themes() { + const html = document.querySelector('html'); + const themeToggleButton = document.getElementById('theme-toggle'); + const themePopup = document.getElementById('theme-list'); + const themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); + const themeIds = []; + themePopup.querySelectorAll('button.theme').forEach(function(el) { + themeIds.push(el.id); + }); + const stylesheets = { + ayuHighlight: document.querySelector('#ayu-highlight-css'), + tomorrowNight: document.querySelector('#tomorrow-night-css'), + highlight: document.querySelector('#highlight-css'), + }; + + function showThemes() { + themePopup.style.display = 'block'; + themeToggleButton.setAttribute('aria-expanded', true); + themePopup.querySelector('button#' + get_theme()).focus(); + } + + function updateThemeSelected() { + themePopup.querySelectorAll('.theme-selected').forEach(function(el) { + el.classList.remove('theme-selected'); + }); + const selected = get_saved_theme() ?? 'default_theme'; + let element = themePopup.querySelector('button#' + selected); + if (element === null) { + // Fall back in case there is no "Default" item. + element = themePopup.querySelector('button#' + get_theme()); + } + element.classList.add('theme-selected'); + } + + function hideThemes() { + themePopup.style.display = 'none'; + themeToggleButton.setAttribute('aria-expanded', false); + themeToggleButton.focus(); + } + + function get_saved_theme() { + let theme = null; + try { + theme = localStorage.getItem('mdbook-theme'); + } catch (e) { + // ignore error. + } + return theme; + } + + function delete_saved_theme() { + localStorage.removeItem('mdbook-theme'); + } + + function get_theme() { + const theme = get_saved_theme(); + if (theme === null || theme === undefined || !themeIds.includes(theme)) { + if (typeof default_dark_theme === 'undefined') { + // A customized index.hbs might not define this, so fall back to + // old behavior of determining the default on page load. + return default_theme; + } + return window.matchMedia('(prefers-color-scheme: dark)').matches + ? default_dark_theme + : default_light_theme; + } else { + return theme; + } + } + + let previousTheme = default_theme; + function set_theme(theme, store = true) { + let ace_theme; + + if (theme === 'coal' || theme === 'navy') { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = false; + stylesheets.highlight.disabled = true; + + ace_theme = 'ace/theme/tomorrow_night'; + } else if (theme === 'ayu') { + stylesheets.ayuHighlight.disabled = false; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = true; + ace_theme = 'ace/theme/tomorrow_night'; + } else { + stylesheets.ayuHighlight.disabled = true; + stylesheets.tomorrowNight.disabled = true; + stylesheets.highlight.disabled = false; + ace_theme = 'ace/theme/dawn'; + } + + setTimeout(function() { + themeColorMetaTag.content = getComputedStyle(document.documentElement).backgroundColor; + }, 1); + + if (window.ace && window.editors) { + window.editors.forEach(function(editor) { + editor.setTheme(ace_theme); + }); + } + + if (store) { + try { + localStorage.setItem('mdbook-theme', theme); + } catch (e) { + // ignore error. + } + } + + html.classList.remove(previousTheme); + html.classList.add(theme); + previousTheme = theme; + updateThemeSelected(); + } + + const query = window.matchMedia('(prefers-color-scheme: dark)'); + query.onchange = function() { + set_theme(get_theme(), false); + }; + + // Set theme. + set_theme(get_theme(), false); + + themeToggleButton.addEventListener('click', function() { + if (themePopup.style.display === 'block') { + hideThemes(); + } else { + showThemes(); + } + }); + + themePopup.addEventListener('click', function(e) { + let theme; + if (e.target.className === 'theme') { + theme = e.target.id; + } else if (e.target.parentElement.className === 'theme') { + theme = e.target.parentElement.id; + } else { + return; + } + if (theme === 'default_theme' || theme === null) { + delete_saved_theme(); + set_theme(get_theme(), false); + } else { + set_theme(theme); + } + }); + + themePopup.addEventListener('focusout', function(e) { + // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) + if (!!e.relatedTarget && + !themeToggleButton.contains(e.relatedTarget) && + !themePopup.contains(e.relatedTarget) + ) { + hideThemes(); + } + }); + + // Should not be needed, but it works around an issue on macOS & iOS: + // https://github.com/rust-lang/mdBook/issues/628 + document.addEventListener('click', function(e) { + if (themePopup.style.display === 'block' && + !themeToggleButton.contains(e.target) && + !themePopup.contains(e.target) + ) { + hideThemes(); + } + }); + + document.addEventListener('keydown', function(e) { + if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { + return; + } + if (!themePopup.contains(e.target)) { + return; + } + + let li; + switch (e.key) { + case 'Escape': + e.preventDefault(); + hideThemes(); + break; + case 'ArrowUp': + e.preventDefault(); + li = document.activeElement.parentElement; + if (li && li.previousElementSibling) { + li.previousElementSibling.querySelector('button').focus(); + } + break; + case 'ArrowDown': + e.preventDefault(); + li = document.activeElement.parentElement; + if (li && li.nextElementSibling) { + li.nextElementSibling.querySelector('button').focus(); + } + break; + case 'Home': + e.preventDefault(); + themePopup.querySelector('li:first-child button').focus(); + break; + case 'End': + e.preventDefault(); + themePopup.querySelector('li:last-child button').focus(); + break; + } + }); +})(); + +(function sidebar() { + const body = document.querySelector('body'); + const sidebar = document.getElementById('sidebar'); + const sidebarLinks = document.querySelectorAll('#sidebar a'); + const sidebarToggleButton = document.getElementById('sidebar-toggle'); + const sidebarToggleAnchor = document.getElementById('sidebar-toggle-anchor'); + const sidebarResizeHandle = document.getElementById('sidebar-resize-handle'); + let firstContact = null; + + function showSidebar() { + body.classList.remove('sidebar-hidden'); + body.classList.add('sidebar-visible'); + Array.from(sidebarLinks).forEach(function(link) { + link.setAttribute('tabIndex', 0); + }); + sidebarToggleButton.setAttribute('aria-expanded', true); + sidebar.setAttribute('aria-hidden', false); + try { + localStorage.setItem('mdbook-sidebar', 'visible'); + } catch (e) { + // Ignore error. + } + } + + function hideSidebar() { + body.classList.remove('sidebar-visible'); + body.classList.add('sidebar-hidden'); + Array.from(sidebarLinks).forEach(function(link) { + link.setAttribute('tabIndex', -1); + }); + sidebarToggleButton.setAttribute('aria-expanded', false); + sidebar.setAttribute('aria-hidden', true); + try { + localStorage.setItem('mdbook-sidebar', 'hidden'); + } catch (e) { + // Ignore error. + } + } + + // Toggle sidebar + sidebarToggleAnchor.addEventListener('change', function sidebarToggle() { + if (sidebarToggleAnchor.checked) { + const current_width = parseInt( + document.documentElement.style.getPropertyValue('--sidebar-target-width'), 10); + if (current_width < 150) { + document.documentElement.style.setProperty('--sidebar-target-width', '150px'); + } + showSidebar(); + } else { + hideSidebar(); + } + }); + + sidebarResizeHandle.addEventListener('mousedown', initResize, false); + + function initResize() { + window.addEventListener('mousemove', resize, false); + window.addEventListener('mouseup', stopResize, false); + body.classList.add('sidebar-resizing'); + } + function resize(e) { + let pos = e.clientX - sidebar.offsetLeft; + if (pos < 20) { + hideSidebar(); + } else { + if (body.classList.contains('sidebar-hidden')) { + showSidebar(); + } + pos = Math.min(pos, window.innerWidth - 100); + document.documentElement.style.setProperty('--sidebar-target-width', pos + 'px'); + } + } + //on mouseup remove windows functions mousemove & mouseup + function stopResize() { + body.classList.remove('sidebar-resizing'); + window.removeEventListener('mousemove', resize, false); + window.removeEventListener('mouseup', stopResize, false); + } + + document.addEventListener('touchstart', function(e) { + firstContact = { + x: e.touches[0].clientX, + time: Date.now(), + }; + }, { passive: true }); + + document.addEventListener('touchmove', function(e) { + if (!firstContact) { + return; + } + + const curX = e.touches[0].clientX; + const xDiff = curX - firstContact.x, + tDiff = Date.now() - firstContact.time; + + if (tDiff < 250 && Math.abs(xDiff) >= 150) { + if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) { + showSidebar(); + } else if (xDiff < 0 && curX < 300) { + hideSidebar(); + } + + firstContact = null; + } + }, { passive: true }); +})(); + +(function chapterNavigation() { + document.addEventListener('keydown', function(e) { + if (e.altKey || e.ctrlKey || e.metaKey) { + return; + } + if (window.search && window.search.hasFocus()) { + return; + } + const html = document.querySelector('html'); + + function next() { + const nextButton = document.querySelector('.nav-chapters.next'); + if (nextButton) { + window.location.href = nextButton.href; + } + } + function prev() { + const previousButton = document.querySelector('.nav-chapters.previous'); + if (previousButton) { + window.location.href = previousButton.href; + } + } + function showHelp() { + const container = document.getElementById('mdbook-help-container'); + const overlay = document.getElementById('mdbook-help-popup'); + container.style.display = 'flex'; + + // Clicking outside the popup will dismiss it. + const mouseHandler = event => { + if (overlay.contains(event.target)) { + return; + } + if (event.button !== 0) { + return; + } + event.preventDefault(); + event.stopPropagation(); + document.removeEventListener('mousedown', mouseHandler); + hideHelp(); + }; + + // Pressing esc will dismiss the popup. + const escapeKeyHandler = event => { + if (event.key === 'Escape') { + event.preventDefault(); + event.stopPropagation(); + document.removeEventListener('keydown', escapeKeyHandler, true); + hideHelp(); + } + }; + document.addEventListener('keydown', escapeKeyHandler, true); + document.getElementById('mdbook-help-container') + .addEventListener('mousedown', mouseHandler); + } + function hideHelp() { + document.getElementById('mdbook-help-container').style.display = 'none'; + } + + // Usually needs the Shift key to be pressed + switch (e.key) { + case '?': + e.preventDefault(); + showHelp(); + break; + } + + // Rest of the keys are only active when the Shift key is not pressed + if (e.shiftKey) { + return; + } + + switch (e.key) { + case 'ArrowRight': + e.preventDefault(); + if (html.dir === 'rtl') { + prev(); + } else { + next(); + } + break; + case 'ArrowLeft': + e.preventDefault(); + if (html.dir === 'rtl') { + next(); + } else { + prev(); + } + break; + } + }); +})(); + +(function clipboard() { + const clipButtons = document.querySelectorAll('.clip-button'); + + function hideTooltip(elem) { + elem.firstChild.innerText = ''; + elem.className = 'clip-button'; + } + + function showTooltip(elem, msg) { + elem.firstChild.innerText = msg; + elem.className = 'clip-button tooltipped'; + } + + const clipboardSnippets = new ClipboardJS('.clip-button', { + text: function(trigger) { + hideTooltip(trigger); + const playground = trigger.closest('pre'); + return playground_text(playground, false); + }, + }); + + Array.from(clipButtons).forEach(function(clipButton) { + clipButton.addEventListener('mouseout', function(e) { + hideTooltip(e.currentTarget); + }); + }); + + clipboardSnippets.on('success', function(e) { + e.clearSelection(); + showTooltip(e.trigger, 'Copied!'); + }); + + clipboardSnippets.on('error', function(e) { + showTooltip(e.trigger, 'Clipboard error!'); + }); +})(); + +(function scrollToTop() { + const menuTitle = document.querySelector('.menu-title'); + + menuTitle.addEventListener('click', function() { + document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); + }); +})(); + +(function controllMenu() { + const menu = document.getElementById('menu-bar'); + + (function controllPosition() { + let scrollTop = document.scrollingElement.scrollTop; + let prevScrollTop = scrollTop; + const minMenuY = -menu.clientHeight - 50; + // When the script loads, the page can be at any scroll (e.g. if you reforesh it). + menu.style.top = scrollTop + 'px'; + // Same as parseInt(menu.style.top.slice(0, -2), but faster + let topCache = menu.style.top.slice(0, -2); + menu.classList.remove('sticky'); + let stickyCache = false; // Same as menu.classList.contains('sticky'), but faster + document.addEventListener('scroll', function() { + scrollTop = Math.max(document.scrollingElement.scrollTop, 0); + // `null` means that it doesn't need to be updated + let nextSticky = null; + let nextTop = null; + const scrollDown = scrollTop > prevScrollTop; + const menuPosAbsoluteY = topCache - scrollTop; + if (scrollDown) { + nextSticky = false; + if (menuPosAbsoluteY > 0) { + nextTop = prevScrollTop; + } + } else { + if (menuPosAbsoluteY > 0) { + nextSticky = true; + } else if (menuPosAbsoluteY < minMenuY) { + nextTop = prevScrollTop + minMenuY; + } + } + if (nextSticky === true && stickyCache === false) { + menu.classList.add('sticky'); + stickyCache = true; + } else if (nextSticky === false && stickyCache === true) { + menu.classList.remove('sticky'); + stickyCache = false; + } + if (nextTop !== null) { + menu.style.top = nextTop + 'px'; + topCache = nextTop; + } + prevScrollTop = scrollTop; + }, { passive: true }); + })(); + (function controllBorder() { + function updateBorder() { + if (menu.offsetTop === 0) { + menu.classList.remove('bordered'); + } else { + menu.classList.add('bordered'); + } + } + updateBorder(); + document.addEventListener('scroll', updateBorder, { passive: true }); + })(); +})(); diff --git a/today/book/clipboard.min.js b/today/book/clipboard.min.js new file mode 100644 index 0000000..02c549e --- /dev/null +++ b/today/book/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.4 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;n .hljs { + color: var(--links); +} + +/* + body-container is necessary because mobile browsers don't seem to like + overflow-x on the body tag when there is a tag. +*/ +#body-container { + /* + This is used when the sidebar pushes the body content off the side of + the screen on small screens. Without it, dragging on mobile Safari + will want to reposition the viewport in a weird way. + */ + overflow-x: clip; +} + +/* Menu Bar */ + +#menu-bar, +#menu-bar-hover-placeholder { + z-index: 101; + margin: auto calc(0px - var(--page-padding)); +} +#menu-bar { + position: relative; + display: flex; + flex-wrap: wrap; + background-color: var(--bg); + border-block-end-color: var(--bg); + border-block-end-width: 1px; + border-block-end-style: solid; +} +#menu-bar.sticky, +#menu-bar-hover-placeholder:hover + #menu-bar, +#menu-bar:hover, +html.sidebar-visible #menu-bar { + position: -webkit-sticky; + position: sticky; + top: 0 !important; +} +#menu-bar-hover-placeholder { + position: sticky; + position: -webkit-sticky; + top: 0; + height: var(--menu-bar-height); +} +#menu-bar.bordered { + border-block-end-color: var(--table-border-color); +} +#menu-bar i, #menu-bar .icon-button { + position: relative; + padding: 0 8px; + z-index: 10; + line-height: var(--menu-bar-height); + cursor: pointer; + transition: color 0.5s; +} +@media only screen and (max-width: 420px) { + #menu-bar i, #menu-bar .icon-button { + padding: 0 5px; + } +} + +.icon-button { + border: none; + background: none; + padding: 0; + color: inherit; +} +.icon-button i { + margin: 0; +} + +.right-buttons { + margin: 0 15px; +} +.right-buttons a { + text-decoration: none; +} + +.left-buttons { + display: flex; + margin: 0 5px; +} +html:not(.js) .left-buttons button { + display: none; +} + +.menu-title { + display: inline-block; + font-weight: 200; + font-size: 2.4rem; + line-height: var(--menu-bar-height); + text-align: center; + margin: 0; + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.menu-title { + cursor: pointer; +} + +.menu-bar, +.menu-bar:visited, +.nav-chapters, +.nav-chapters:visited, +.mobile-nav-chapters, +.mobile-nav-chapters:visited, +.menu-bar .icon-button, +.menu-bar a i { + color: var(--icons); +} + +.menu-bar i:hover, +.menu-bar .icon-button:hover, +.nav-chapters:hover, +.mobile-nav-chapters i:hover { + color: var(--icons-hover); +} + +/* Nav Icons */ + +.nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + + position: fixed; + top: 0; + bottom: 0; + margin: 0; + max-width: 150px; + min-width: 90px; + + display: flex; + justify-content: center; + align-content: center; + flex-direction: column; + + transition: color 0.5s, background-color 0.5s; +} + +.nav-chapters:hover { + text-decoration: none; + background-color: var(--theme-hover); + transition: background-color 0.15s, color 0.15s; +} + +.nav-wrapper { + margin-block-start: 50px; + display: none; +} + +.mobile-nav-chapters { + font-size: 2.5em; + text-align: center; + text-decoration: none; + width: 90px; + border-radius: 5px; + background-color: var(--sidebar-bg); +} + +/* Only Firefox supports flow-relative values */ +.previous { float: left; } +[dir=rtl] .previous { float: right; } + +/* Only Firefox supports flow-relative values */ +.next { + float: right; + right: var(--page-padding); +} +[dir=rtl] .next { + float: left; + right: unset; + left: var(--page-padding); +} + +/* Use the correct buttons for RTL layouts*/ +[dir=rtl] .previous i.fa-angle-left:before {content:"\f105";} +[dir=rtl] .next i.fa-angle-right:before { content:"\f104"; } + +@media only screen and (max-width: 1080px) { + .nav-wide-wrapper { display: none; } + .nav-wrapper { display: block; } +} + +/* sidebar-visible */ +@media only screen and (max-width: 1380px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; } + #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; } +} + +/* Inline code */ + +:not(pre) > .hljs { + display: inline; + padding: 0.1em 0.3em; + border-radius: 3px; +} + +:not(pre):not(a) > .hljs { + color: var(--inline-code-color); + overflow-x: initial; +} + +a:hover > .hljs { + text-decoration: underline; +} + +pre { + position: relative; +} +pre > .buttons { + position: absolute; + z-index: 100; + right: 0px; + top: 2px; + margin: 0px; + padding: 2px 0px; + + color: var(--sidebar-fg); + cursor: pointer; + visibility: hidden; + opacity: 0; + transition: visibility 0.1s linear, opacity 0.1s linear; +} +pre:hover > .buttons { + visibility: visible; + opacity: 1 +} +pre > .buttons :hover { + color: var(--sidebar-active); + border-color: var(--icons-hover); + background-color: var(--theme-hover); +} +pre > .buttons i { + margin-inline-start: 8px; +} +pre > .buttons button { + cursor: inherit; + margin: 0px 5px; + padding: 4px 4px 3px 5px; + font-size: 23px; + + border-style: solid; + border-width: 1px; + border-radius: 4px; + border-color: var(--icons); + background-color: var(--theme-popup-bg); + transition: 100ms; + transition-property: color,border-color,background-color; + color: var(--icons); +} + +pre > .buttons button.clip-button { + padding: 2px 4px 0px 6px; +} +pre > .buttons button.clip-button::before { + /* clipboard image from octicons (https://github.com/primer/octicons/tree/v2.0.0) MIT license + */ + content: url('data:image/svg+xml,\ +\ +\ +'); + filter: var(--copy-button-filter); +} +pre > .buttons button.clip-button:hover::before { + filter: var(--copy-button-filter-hover); +} + +@media (pointer: coarse) { + pre > .buttons button { + /* On mobile, make it easier to tap buttons. */ + padding: 0.3rem 1rem; + } + + .sidebar-resize-indicator { + /* Hide resize indicator on devices with limited accuracy */ + display: none; + } +} +pre > code { + display: block; + padding: 1rem; +} + +/* FIXME: ACE editors overlap their buttons because ACE does absolute + positioning within the code block which breaks padding. The only solution I + can think of is to move the padding to the outer pre tag (or insert a div + wrapper), but that would require fixing a whole bunch of CSS rules. +*/ +.hljs.ace_editor { + padding: 0rem 0rem; +} + +pre > .result { + margin-block-start: 10px; +} + +/* Search */ + +#searchresults a { + text-decoration: none; +} + +mark { + border-radius: 2px; + padding-block-start: 0; + padding-block-end: 1px; + padding-inline-start: 3px; + padding-inline-end: 3px; + margin-block-start: 0; + margin-block-end: -1px; + margin-inline-start: -3px; + margin-inline-end: -3px; + background-color: var(--search-mark-bg); + transition: background-color 300ms linear; + cursor: pointer; +} + +mark.fade-out { + background-color: rgba(0,0,0,0) !important; + cursor: auto; +} + +.searchbar-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} + +#searchbar { + width: 100%; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: auto; + margin-inline-end: auto; + padding: 10px 16px; + transition: box-shadow 300ms ease-in-out; + border: 1px solid var(--searchbar-border-color); + border-radius: 3px; + background-color: var(--searchbar-bg); + color: var(--searchbar-fg); +} +#searchbar:focus, +#searchbar.active { + box-shadow: 0 0 3px var(--searchbar-shadow-color); +} + +.searchresults-header { + font-weight: bold; + font-size: 1em; + padding-block-start: 18px; + padding-block-end: 0; + padding-inline-start: 5px; + padding-inline-end: 0; + color: var(--searchresults-header-fg); +} + +.searchresults-outer { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); + border-block-end: 1px dashed var(--searchresults-border-color); +} + +ul#searchresults { + list-style: none; + padding-inline-start: 20px; +} +ul#searchresults li { + margin: 10px 0px; + padding: 2px; + border-radius: 2px; +} +ul#searchresults li.focus { + background-color: var(--searchresults-li-bg); +} +ul#searchresults span.teaser { + display: block; + clear: both; + margin-block-start: 5px; + margin-block-end: 0; + margin-inline-start: 20px; + margin-inline-end: 0; + font-size: 0.8em; +} +ul#searchresults span.teaser em { + font-weight: bold; + font-style: normal; +} + +/* Sidebar */ + +.sidebar { + position: fixed; + left: 0; + top: 0; + bottom: 0; + width: var(--sidebar-width); + font-size: 0.875em; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + overscroll-behavior-y: contain; + background-color: var(--sidebar-bg); + color: var(--sidebar-fg); +} +.sidebar-iframe-inner { + --padding: 10px; + + background-color: var(--sidebar-bg); + padding: var(--padding); + margin: 0; + font-size: 1.4rem; + color: var(--sidebar-fg); + min-height: calc(100vh - var(--padding) * 2); +} +.sidebar-iframe-outer { + border: none; + height: 100%; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} +[dir=rtl] .sidebar { left: unset; right: 0; } +.sidebar-resizing { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} +html:not(.sidebar-resizing) .sidebar { + transition: transform 0.3s; /* Animation: slide away */ +} +.sidebar code { + line-height: 2em; +} +.sidebar .sidebar-scrollbox { + overflow-y: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + padding: 10px 10px; +} +.sidebar .sidebar-resize-handle { + position: absolute; + cursor: col-resize; + width: 0; + right: calc(var(--sidebar-resize-indicator-width) * -1); + top: 0; + bottom: 0; + display: flex; + align-items: center; +} + +.sidebar-resize-handle .sidebar-resize-indicator { + width: 100%; + height: 16px; + color: var(--icons); + margin-inline-start: var(--sidebar-resize-indicator-space); + display: flex; + align-items: center; + justify-content: flex-start; +} +.sidebar-resize-handle .sidebar-resize-indicator::before { + content: ""; + width: 2px; + height: 12px; + border-left: dotted 2px currentColor; +} +.sidebar-resize-handle .sidebar-resize-indicator::after { + content: ""; + width: 2px; + height: 16px; + border-left: dotted 2px currentColor; +} + +[dir=rtl] .sidebar .sidebar-resize-handle { + left: calc(var(--sidebar-resize-indicator-width) * -1); + right: unset; +} +.js .sidebar .sidebar-resize-handle { + cursor: col-resize; + width: calc(var(--sidebar-resize-indicator-width) - var(--sidebar-resize-indicator-space)); +} +/* sidebar-hidden */ +#sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); + z-index: -1; +} +[dir=rtl] #sidebar-toggle-anchor:not(:checked) ~ .sidebar { + transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); +} +.sidebar::-webkit-scrollbar { + background: var(--sidebar-bg); +} +.sidebar::-webkit-scrollbar-thumb { + background: var(--scrollbar); +} + +/* sidebar-visible */ +#sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); +} +[dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); +} +@media only screen and (min-width: 620px) { + #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + margin-inline-start: calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)); + } + [dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { + transform: none; + } +} + +.chapter { + list-style: none outside none; + padding-inline-start: 0; + line-height: 2.2em; +} + +.chapter ol { + width: 100%; +} + +.chapter li { + display: flex; + color: var(--sidebar-non-existant); +} +.chapter li a { + display: block; + padding: 0; + text-decoration: none; + color: var(--sidebar-fg); +} + +.chapter li a:hover { + color: var(--sidebar-active); +} + +.chapter li a.active { + color: var(--sidebar-active); +} + +.chapter li > a.toggle { + cursor: pointer; + display: block; + margin-inline-start: auto; + padding: 0 10px; + user-select: none; + opacity: 0.68; +} + +.chapter li > a.toggle div { + transition: transform 0.5s; +} + +/* collapse the section */ +.chapter li:not(.expanded) + li > ol { + display: none; +} + +.chapter li.chapter-item { + line-height: 1.5em; + margin-block-start: 0.6em; +} + +.chapter li.expanded > a.toggle div { + transform: rotate(90deg); +} + +.spacer { + width: 100%; + height: 3px; + margin: 5px 0px; +} +.chapter .spacer { + background-color: var(--sidebar-spacer); +} + +@media (-moz-touch-enabled: 1), (pointer: coarse) { + .chapter li a { padding: 5px 0; } + .spacer { margin: 10px 0; } +} + +.section { + list-style: none outside none; + padding-inline-start: 20px; + line-height: 1.9em; +} + +/* Theme Menu Popup */ + +.theme-popup { + position: absolute; + left: 10px; + top: var(--menu-bar-height); + z-index: 1000; + border-radius: 4px; + font-size: 0.7em; + color: var(--fg); + background: var(--theme-popup-bg); + border: 1px solid var(--theme-popup-border); + margin: 0; + padding: 0; + list-style: none; + display: none; + /* Don't let the children's background extend past the rounded corners. */ + overflow: hidden; +} +[dir=rtl] .theme-popup { left: unset; right: 10px; } +.theme-popup .default { + color: var(--icons); +} +.theme-popup .theme { + width: 100%; + border: 0; + margin: 0; + padding: 2px 20px; + line-height: 25px; + white-space: nowrap; + text-align: start; + cursor: pointer; + color: inherit; + background: inherit; + font-size: inherit; +} +.theme-popup .theme:hover { + background-color: var(--theme-hover); +} + +.theme-selected::before { + display: inline-block; + content: "✓"; + margin-inline-start: -14px; + width: 14px; +} + +/* The container for the help popup that covers the whole window. */ +#mdbook-help-container { + /* Position and size for the whole window. */ + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + /* This uses flex layout (which is set in book.js), and centers the popup + in the window.*/ + display: none; + align-items: center; + justify-content: center; + z-index: 1000; + /* Dim out the book while the popup is visible. */ + background: var(--overlay-bg); +} + +/* The popup help box. */ +#mdbook-help-popup { + box-shadow: 0 4px 24px rgba(0,0,0,0.15); + min-width: 300px; + max-width: 500px; + width: 100%; + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: center; + background-color: var(--bg); + color: var(--fg); + border-width: 1px; + border-color: var(--theme-popup-border); + border-style: solid; + border-radius: 8px; + padding: 10px; +} + +.mdbook-help-title { + text-align: center; + /* mdbook's margin for h2 is way too large. */ + margin: 10px; +} diff --git a/today/book/css/general.css b/today/book/css/general.css new file mode 100644 index 0000000..9946cfc --- /dev/null +++ b/today/book/css/general.css @@ -0,0 +1,279 @@ +/* Base styles and content styles */ + +:root { + /* Browser default font-size is 16px, this way 1 rem = 10px */ + font-size: 62.5%; + color-scheme: var(--color-scheme); +} + +html { + font-family: "Open Sans", sans-serif; + color: var(--fg); + background-color: var(--bg); + text-size-adjust: none; + -webkit-text-size-adjust: none; +} + +body { + margin: 0; + font-size: 1.6rem; + overflow-x: hidden; +} + +code { + font-family: var(--mono-font) !important; + font-size: var(--code-font-size); + direction: ltr !important; +} + +/* make long words/inline code not x overflow */ +main { + overflow-wrap: break-word; +} + +/* make wide tables scroll if they overflow */ +.table-wrapper { + overflow-x: auto; +} + +/* Don't change font size in headers. */ +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + font-size: unset; +} + +.left { float: left; } +.right { float: right; } +.boring { opacity: 0.6; } +.hide-boring .boring { display: none; } +.hidden { display: none !important; } + +h2, h3 { margin-block-start: 2.5em; } +h4, h5 { margin-block-start: 2em; } + +.header + .header h3, +.header + .header h4, +.header + .header h5 { + margin-block-start: 1em; +} + +h1:target::before, +h2:target::before, +h3:target::before, +h4:target::before, +h5:target::before, +h6:target::before { + display: inline-block; + content: "»"; + margin-inline-start: -30px; + width: 30px; +} + +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { + /* Safari does not support logical properties */ + scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); +} + +.page { + outline: 0; + padding: 0 var(--page-padding); + margin-block-start: calc(0px - var(--menu-bar-height)); /* Compensate for the #menu-bar-hover-placeholder */ +} +.page-wrapper { + box-sizing: border-box; + background-color: var(--bg); +} +.no-js .page-wrapper, +.js:not(.sidebar-resizing) .page-wrapper { + transition: margin-left 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} +[dir=rtl] .js:not(.sidebar-resizing) .page-wrapper { + transition: margin-right 0.3s ease, transform 0.3s ease; /* Animation: slide away */ +} + +.content { + overflow-y: auto; + padding: 0 5px 50px 5px; +} +.content main { + margin-inline-start: auto; + margin-inline-end: auto; + max-width: var(--content-max-width); +} +.content p { line-height: 1.45em; } +.content ol { line-height: 1.45em; } +.content ul { line-height: 1.45em; } +.content a { text-decoration: none; } +.content a:hover { text-decoration: underline; } +.content img, .content video { max-width: 100%; } +.content .header:link, +.content .header:visited { + color: var(--fg); +} +.content .header:link, +.content .header:visited:hover { + text-decoration: none; +} + +table { + margin: 0 auto; + border-collapse: collapse; +} +table td { + padding: 3px 20px; + border: 1px var(--table-border-color) solid; +} +table thead { + background: var(--table-header-bg); +} +table thead td { + font-weight: 700; + border: none; +} +table thead th { + padding: 3px 20px; +} +table thead tr { + border: 1px var(--table-header-bg) solid; +} +/* Alternate background colors for rows */ +table tbody tr:nth-child(2n) { + background: var(--table-alternate-bg); +} + + +blockquote { + margin: 20px 0; + padding: 0 20px; + color: var(--fg); + background-color: var(--quote-bg); + border-block-start: .1em solid var(--quote-border); + border-block-end: .1em solid var(--quote-border); +} + +.warning { + margin: 20px; + padding: 0 20px; + border-inline-start: 2px solid var(--warning-border); +} + +.warning:before { + position: absolute; + width: 3rem; + height: 3rem; + margin-inline-start: calc(-1.5rem - 21px); + content: "ⓘ"; + text-align: center; + background-color: var(--bg); + color: var(--warning-border); + font-weight: bold; + font-size: 2rem; +} + +blockquote .warning:before { + background-color: var(--quote-bg); +} + +kbd { + background-color: var(--table-border-color); + border-radius: 4px; + border: solid 1px var(--theme-popup-border); + box-shadow: inset 0 -1px 0 var(--theme-hover); + display: inline-block; + font-size: var(--code-font-size); + font-family: var(--mono-font); + line-height: 10px; + padding: 4px 5px; + vertical-align: middle; +} + +sup { + /* Set the line-height for superscript and footnote references so that there + isn't an awkward space appearing above lines that contain the footnote. + + See https://github.com/rust-lang/mdBook/pull/2443#discussion_r1813773583 + for an explanation. + */ + line-height: 0; +} + +.footnote-definition { + font-size: 0.9em; +} +/* The default spacing for a list is a little too large. */ +.footnote-definition ul, +.footnote-definition ol { + padding-left: 20px; +} +.footnote-definition > li { + /* Required to position the ::before target */ + position: relative; +} +.footnote-definition > li:target { + scroll-margin-top: 50vh; +} +.footnote-reference:target { + scroll-margin-top: 50vh; +} +/* Draws a border around the footnote (including the marker) when it is selected. + TODO: If there are multiple linkbacks, highlight which one you just came + from so you know which one to click. +*/ +.footnote-definition > li:target::before { + border: 2px solid var(--footnote-highlight); + border-radius: 6px; + position: absolute; + top: -8px; + right: -8px; + bottom: -8px; + left: -32px; + pointer-events: none; + content: ""; +} +/* Pulses the footnote reference so you can quickly see where you left off reading. + This could use some improvement. +*/ +@media not (prefers-reduced-motion) { + .footnote-reference:target { + animation: fn-highlight 0.8s; + border-radius: 2px; + } + + @keyframes fn-highlight { + from { + background-color: var(--footnote-highlight); + } + } +} + +.tooltiptext { + position: absolute; + visibility: hidden; + color: #fff; + background-color: #333; + transform: translateX(-50%); /* Center by moving tooltip 50% of its width left */ + left: -8px; /* Half of the width of the icon */ + top: -35px; + font-size: 0.8em; + text-align: center; + border-radius: 6px; + padding: 5px 8px; + margin: 5px; + z-index: 1000; +} +.tooltipped .tooltiptext { + visibility: visible; +} + +.chapter li.part-title { + color: var(--sidebar-fg); + margin: 5px 0px; + font-weight: bold; +} + +.result-no-output { + font-style: italic; +} diff --git a/today/book/css/print.css b/today/book/css/print.css new file mode 100644 index 0000000..80ec3a5 --- /dev/null +++ b/today/book/css/print.css @@ -0,0 +1,50 @@ + +#sidebar, +#menu-bar, +.nav-chapters, +.mobile-nav-chapters { + display: none; +} + +#page-wrapper.page-wrapper { + transform: none !important; + margin-inline-start: 0px; + overflow-y: initial; +} + +#content { + max-width: none; + margin: 0; + padding: 0; +} + +.page { + overflow-y: initial; +} + +code { + direction: ltr !important; +} + +pre > .buttons { + z-index: 2; +} + +a, a:visited, a:active, a:hover { + color: #4183c4; + text-decoration: none; +} + +h1, h2, h3, h4, h5, h6 { + page-break-inside: avoid; + page-break-after: avoid; +} + +pre, code { + page-break-inside: avoid; + white-space: pre-wrap; +} + +.fa { + display: none !important; +} diff --git a/today/book/css/variables.css b/today/book/css/variables.css new file mode 100644 index 0000000..5742d24 --- /dev/null +++ b/today/book/css/variables.css @@ -0,0 +1,330 @@ + +/* Globals */ + +:root { + --sidebar-target-width: 300px; + --sidebar-width: min(var(--sidebar-target-width), 80vw); + --sidebar-resize-indicator-width: 8px; + --sidebar-resize-indicator-space: 2px; + --page-padding: 15px; + --content-max-width: 750px; + --menu-bar-height: 50px; + --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; + --code-font-size: 0.875em; /* please adjust the ace font size accordingly in editor.js */ +} + +/* Themes */ + +.ayu { + --bg: hsl(210, 25%, 8%); + --fg: #c5c5c5; + + --sidebar-bg: #14191f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #5c6773; + --sidebar-active: #ffb454; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #0096cf; + + --inline-code-color: #ffb454; + + --theme-popup-bg: #14191f; + --theme-popup-border: #5c6773; + --theme-hover: #191f26; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(210, 25%, 13%); + --table-header-bg: hsl(210, 25%, 28%); + --table-alternate-bg: hsl(210, 25%, 11%); + + --searchbar-border-color: #848484; + --searchbar-bg: #424242; + --searchbar-fg: #fff; + --searchbar-shadow-color: #d4c89f; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #252932; + --search-mark-bg: #e3b171; + + --color-scheme: dark; + + /* Same as `--icons` */ + --copy-button-filter: invert(45%) sepia(6%) saturate(621%) hue-rotate(198deg) brightness(99%) contrast(85%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(68%) sepia(55%) saturate(531%) hue-rotate(341deg) brightness(104%) contrast(101%); + + --footnote-highlight: #2668a6; + + --overlay-bg: rgba(33, 40, 48, 0.4); +} + +.coal { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + + --color-scheme: dark; + + /* Same as `--icons` */ + --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%); + + --footnote-highlight: #4079ae; + + --overlay-bg: rgba(33, 40, 48, 0.4); +} + +.light, html:not(.js) { + --bg: hsl(0, 0%, 100%); + --fg: hsl(0, 0%, 0%); + + --sidebar-bg: #fafafa; + --sidebar-fg: hsl(0, 0%, 0%); + --sidebar-non-existant: #aaaaaa; + --sidebar-active: #1f1fff; + --sidebar-spacer: #f4f4f4; + + --scrollbar: #8F8F8F; + + --icons: #747474; + --icons-hover: #000000; + + --links: #20609f; + + --inline-code-color: #301900; + + --theme-popup-bg: #fafafa; + --theme-popup-border: #cccccc; + --theme-hover: #e6e6e6; + + --quote-bg: hsl(197, 37%, 96%); + --quote-border: hsl(197, 37%, 91%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(0, 0%, 95%); + --table-header-bg: hsl(0, 0%, 80%); + --table-alternate-bg: hsl(0, 0%, 97%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #e4f2fe; + --search-mark-bg: #a2cff5; + + --color-scheme: light; + + /* Same as `--icons` */ + --copy-button-filter: invert(45.49%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(14%) sepia(93%) saturate(4250%) hue-rotate(243deg) brightness(99%) contrast(130%); + + --footnote-highlight: #7e7eff; + + --overlay-bg: rgba(200, 200, 205, 0.4); +} + +.navy { + --bg: hsl(226, 23%, 11%); + --fg: #bcbdd0; + + --sidebar-bg: #282d3f; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505274; + --sidebar-active: #2b79a2; + --sidebar-spacer: #2d334f; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #b7b9cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #161923; + --theme-popup-border: #737480; + --theme-hover: #282e40; + + --quote-bg: hsl(226, 15%, 17%); + --quote-border: hsl(226, 15%, 22%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(226, 23%, 16%); + --table-header-bg: hsl(226, 23%, 31%); + --table-alternate-bg: hsl(226, 23%, 14%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #aeaec6; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #5f5f71; + --searchresults-border-color: #5c5c68; + --searchresults-li-bg: #242430; + --search-mark-bg: #a2cff5; + + --color-scheme: dark; + + /* Same as `--icons` */ + --copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(46%) sepia(20%) saturate(1537%) hue-rotate(156deg) brightness(85%) contrast(90%); + + --footnote-highlight: #4079ae; + + --overlay-bg: rgba(33, 40, 48, 0.4); +} + +.rust { + --bg: hsl(60, 9%, 87%); + --fg: #262625; + + --sidebar-bg: #3b2e2a; + --sidebar-fg: #c8c9db; + --sidebar-non-existant: #505254; + --sidebar-active: #e69f67; + --sidebar-spacer: #45373a; + + --scrollbar: var(--sidebar-fg); + + --icons: #737480; + --icons-hover: #262625; + + --links: #2b79a2; + + --inline-code-color: #6e6b5e; + + --theme-popup-bg: #e1e1db; + --theme-popup-border: #b38f6b; + --theme-hover: #99908a; + + --quote-bg: hsl(60, 5%, 75%); + --quote-border: hsl(60, 5%, 70%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(60, 9%, 82%); + --table-header-bg: #b3a497; + --table-alternate-bg: hsl(60, 9%, 84%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #fafafa; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #888; + --searchresults-li-bg: #dec2a2; + --search-mark-bg: #e69f67; + + /* Same as `--icons` */ + --copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(77%) sepia(16%) saturate(1798%) hue-rotate(328deg) brightness(98%) contrast(83%); + + --footnote-highlight: #d3a17a; + + --overlay-bg: rgba(150, 150, 150, 0.25); +} + +@media (prefers-color-scheme: dark) { + html:not(.js) { + --bg: hsl(200, 7%, 8%); + --fg: #98a3ad; + + --sidebar-bg: #292c2f; + --sidebar-fg: #a1adb8; + --sidebar-non-existant: #505254; + --sidebar-active: #3473ad; + --sidebar-spacer: #393939; + + --scrollbar: var(--sidebar-fg); + + --icons: #43484d; + --icons-hover: #b3c0cc; + + --links: #2b79a2; + + --inline-code-color: #c5c8c6; + + --theme-popup-bg: #141617; + --theme-popup-border: #43484d; + --theme-hover: #1f2124; + + --quote-bg: hsl(234, 21%, 18%); + --quote-border: hsl(234, 21%, 23%); + + --warning-border: #ff8e00; + + --table-border-color: hsl(200, 7%, 13%); + --table-header-bg: hsl(200, 7%, 28%); + --table-alternate-bg: hsl(200, 7%, 11%); + + --searchbar-border-color: #aaa; + --searchbar-bg: #b7b7b7; + --searchbar-fg: #000; + --searchbar-shadow-color: #aaa; + --searchresults-header-fg: #666; + --searchresults-border-color: #98a3ad; + --searchresults-li-bg: #2b2b2f; + --search-mark-bg: #355c7d; + + --color-scheme: dark; + + /* Same as `--icons` */ + --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%); + /* Same as `--sidebar-active` */ + --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%); + } +} diff --git a/today/book/daily/2025-06-01.html b/today/book/daily/2025-06-01.html new file mode 100644 index 0000000..afb0563 --- /dev/null +++ b/today/book/daily/2025-06-01.html @@ -0,0 +1,231 @@ + + + + + + 06-01-日刊 - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025年6月1日

+
    +
  1. 近日,通义实验室自然语言智能团队发布并开源VRAG-RL——一款视觉感知多模态RAG推理框架,旨在解决AI从图像、表格等视觉语言中检索关键信息并进行精细化推理的难题,其强化学习和创新的视觉感知机制显著提升了对视觉信息的理解和检索效率。该框架在多个基准数据集上表现出色,未来有望提升模型在不同视觉任务中的泛化能力,请查阅跳转链接了解更多。
  2. +
  3. 亚利桑那州立大学研究小组发布论文指出,大语言模型并非进行真正推理,而仅仅是在寻找数据间的相关性,这可能导致公众对其工作机制产生误解。该研究强调,在日益依赖AI的时代,我们需更谨慎看待技术能力,未来AI研究有望朝着更具解释性的方向发展。
  4. +
  5. Perplexity AI正式推出Perplexity Labs,为Pro订阅用户带来多工具协同的全新AI生产力工具,能将复杂项目开发流程简化至数分钟,旨在提供从创意到成果的全链条支持。这一功能通过深度网络浏览、代码执行等核心能力,标志着Perplexity从答案引擎向综合性AI生产平台转型
  6. +
  7. 夸克近日上线“深度研究”功能,该功能依托通义千问大模型,能围绕学术课题、行业分析等复杂议题,自动完成从资料搜集到报告生成的全流程研究。此举标志着AI正从信息检索工具内容创作伙伴进一步跃迁,为科研调研、市场洞察等场景提供高效支持
  8. +
  9. 阿里云正式发布通义灵码 AI IDE,这是一款原生的人工智能开发环境,凭借强大的编程智能体模式长期记忆行间建议预测功能,显著提升开发者编程效率。该产品已免费开放下载,并且其插件累计生成超30亿行代码,成为广受欢迎的编程辅助工具,为企业开发工作提供强力支持
  10. +
  11. Memvid是一款创新AI记忆工具,通过将文本数据编码为MP4视频,实现了亚秒级快速语义搜索,大幅节省存储空间并支持离线使用。它内置聊天功能,支持PDF文档导入,为高效知识管理学术研究等领域提供了革命性的全新可能,请查阅跳转链接了解更多。
  12. +
  13. Anthropic首席执行官达里奥・阿莫代伊警告称,AI可能在未来五年内取代一半入门级白领工作,导致失业率飙升至10%-20%,并加剧经济不平等。他呼吁提高公众对AI发展的认知AI素养,以便人们适应未来职业环境,并强调政策制定者需思考超智能经济下的解决方案
  14. +
  15. AI初创公司Manus重磅发布Manus Slides功能,用户仅需一个提示词即可一键生成专业幻灯片,涵盖商务会议、教育课程等多种场景,大幅提升演示文稿创作效率。该功能凭借智能生成灵活编辑能力,支持导出PowerPoint或PDF,标志着AI代理正从任务自动化向生产力工具进一步演进。
  16. +
  17. 在GitHub上拥有7086颗星prompt-eng-interactive-tutorial,是Anthropic公司交互式提示工程教程的开源项目,旨在帮助用户有趣且有效地学习提示工程,具体请访问跳转链接
  18. +
  19. 获得10143颗星onlook项目,是一个开源可视化氛围编码编辑器,它利用AI帮助设计师或开发者可视化构建美化和编辑React应用。这款工具就像是设计师的光标,让React开发变得更直观高效,具体请访问跳转链接
  20. +
  21. 拥有12755颗星anthropic-cookbook项目,是Anthropic公司展示如何有趣且有效地使用Claude笔记本/秘籍集合。它为用户提供了多样化的Claude使用方法,是学习和应用Claude的便捷跳转链接
  22. +
  23. MMSI-Bench是一个针对多图像空间智能VQA基准测试,研究发现,尽管多模态大语言模型(MLLMs)已取得进展,但在多图像空间推理方面,其准确率(30-40%)与人类(97%)之间存在巨大差距。该研究诊断了模型四种主要的失败模式,为未来提升多图像空间智能提供了宝贵见解,论文详情请见跳转链接
  24. +
  25. ZeroGUI是一个创新的在线学习框架,它以零人力成本自动化GUI智能体训练,通过基于VLM的自动任务生成和奖励评估,克服了传统GUI学习对人工标注的重度依赖。实验证明,该框架显著提升了GUI智能体在不同环境下的性能,为自动化GUI操作带来了高效解决方案,论文详情请见跳转链接
  26. +
  27. ATLAS是一个针对Transformer架构设计的高容量长期记忆模块,它通过优化记忆上下文来克服现有模型在长序列理解上的局限,从而在测试时学习最优的记忆策略。实验结果表明,ATLAS在语言建模和长上下文理解等任务中表现优于Transformer和线性循环模型,显著提升了性能,论文详情请见跳转链接
  28. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/daily/2025-06-02.html b/today/book/daily/2025-06-02.html new file mode 100644 index 0000000..e76fb14 --- /dev/null +++ b/today/book/daily/2025-06-02.html @@ -0,0 +1,250 @@ + + + + + + 06-02-日刊 - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025年6月2日

+

AI产品与功能更新

+
    +
  1. Runway公司最新推出的Gen-4References功能已支持移动设备,使用户能通过手机照片结合自然语言提示,快速生成风格一致的艺术作品。这项功能将AI生成技术与移动便捷性完美结合,大幅降低了AI创作门槛,为内容创作者和普通用户带来了无限可能。 +
    图片
  2. +
  3. Anthropic近期宣布,其旗舰模型Claude已新增功能,支持开发者构建能与Claude直接对话的AI应用程序,这与AI Studio的开发理念高度契合。此举不仅降低了AI应用开发门槛,为开发者提供了更广阔的创新空间,也预示着AI应用普及与落地将进一步加速。 +
    图片
  4. +
+

AI前沿研究

+
    +
  1. 华为近期通过其"昇腾 + Pangu Ultra MoE”系统展示了一项惊人突破:一个近万亿参数的MoE大模型,在不使用GPU的情况下,仅需2秒便能解答一道高等数学题。这不仅彰显了华为在自主可控国产算力与模型训练方面的强大实力,也为未来大规模AI模型的训练与应用开辟了新可能。 +
    图片
  2. +
  3. 这篇论文通过构建一个英语回文谜题基准测试,揭示了当前视觉-语言模型VLM)在理解和解决这类谜题时遇到的显著困难。尽管VLM在解码简单视觉线索方面表现出一定能力,但对于需要抽象推理横向思维及理解视觉隐喻的任务,它们仍旧力不从心,表明多模态抽象是其面临的独特挑战。详情请见:Link
  4. +
  5. LoRAShop是一个创新的多概念图像编辑框架,它利用修正流Transformer的特性,实现了在不重新训练模型的情况下,将多个主题或风格无缝融入原始场景。这项技术通过智能融合LoRA权重,不仅保留了图像的整体背景和细节,还在身份保持上超越了现有基线,为个性化图像生成编辑带来了革命性的"Photoshop式”体验。详情请见:Link
  6. +
  7. DeepTheorem是一个利用自然语言强化学习RL-Zero)来增强大型语言模型LLM)数学推理能力的非正式定理证明框架。该框架通过一个大规模高质量数据集和创新策略,显著提升了LLM在IMO级别非正式定理证明中的表现,展现了其在数学探索和自动化证明领域的巨大潜力。详情请见:Link
  8. +
+

AI行业展望与社会影响

+
    +
  1. 根据阿姆斯特丹自由大学环境研究所博士生Alex de Vries-Gao的分析,人工智能的电力消耗预计将在2025年底前接近全球数据中心总电力消耗的一半,这意味着其能耗将很快超越比特币挖矿。尽管技术效率有所提升,但AI的电力需求仍在快速增长,凸显了在能耗与可持续发展之间寻找平衡的重要性。 +
    图片
  2. +
  3. 近期,黑客通过伪装成阿里云AI SDK的恶意软件包,成功实施了供应链攻击,利用隐藏在Pickle格式ML模型中的恶意代码窃取用户敏感信息。这揭示了AI安全供应链面临的新挑战,传统安全工具在检测恶意ML模型方面的不足,以及开发者面临的潜在风险。 +
    图片
  4. +
+

开源TOP项目

+
    +
  1. courses是一个由Anthropic提供的教育课程项目,旨在帮助用户学习相关知识。该项目在GitHub上拥有13483颗星,可访问其GitHub页面:Link
  2. +
  3. agent-zero是一个提供AI框架功能的项目,旨在帮助开发者构建AI应用。该项目在GitHub上获得了7360颗星,详情可前往:Link
  4. +
  5. cobalt是一个致力于"保存你所喜爱事物的最佳方式”的项目,为用户提供高效的收藏管理功能。该项目在GitHub上备受欢迎,拥有32941颗星,可通过Link查看详情。
  6. +
  7. the-book-of-secret-knowledge是一个内容丰富的知识集合项目,汇集了鼓舞人心的列表、手册、备忘单及各类工具。该项目在GitHub上拥有高达171992颗星,是寻求实用信息和技巧的宝库,访问地址为:Link
  8. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/daily/2025-06-03.html b/today/book/daily/2025-06-03.html new file mode 100644 index 0000000..9dd51f5 --- /dev/null +++ b/today/book/daily/2025-06-03.html @@ -0,0 +1,243 @@ + + + + + + 06-03-日刊 - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025年6月3日

+

AI产品与功能更新

+
    +
  1. 谷歌近日在美国地区推出了 Gemini Live 功能,正式登陆 iOSiPadOS 平台,用户可通过 Gemini App 免费体验 AI 识别场景和屏幕内容的便捷。这项创新不仅提升了用户互动体验,也预示着 AI 技术正进一步融入日常生活,成为人们的智能助手。
    图片
  2. +
  3. 微软最新推出了免费的 Bing Video Creator 工具,基于 OpenAI Sora 技术,让用户通过简单的文字提示即可轻松创作短视频。这款工具已在全球范围内的必应移动应用中上线,极大降低了视频创作的门槛,有望丰富用户的创作体验。
    图片
  4. +
  5. 新加坡国立大学(NUS)团队近日发布了 OmniConsistency 项目,它以极低成本复现了 GPT-4o 在图像风格化上的一致性,解决了开源社区的风格化难题。该项目通过独特的学习框架和模块化架构,有望成为图像生成领域的重要工具,推动 AI 艺术创作。
    图片
  6. +
+

AI前沿研究

+
    +
  1. WebChoreArena (Link) 提出了一个包含 532 项精心策划任务的全新基准,旨在评估 LLM 驱动的网页浏览代理处理繁琐复杂网页任务的能力。研究发现,尽管 GPT-4o 等先进大模型在此基准上表现出显著进步,但相较于通用网页任务,仍有巨大的提升空间,凸显了处理复杂**"网络杂务”**的挑战性。
  2. +
  3. RoboMaster (Link) 提出了一种创新的机器人操作视频生成框架,它通过协作轨迹建模和阶段性分解交互过程,有效解决了多目标交互中视觉保真度下降的问题。这项技术成功地实现了机器人操作中视频生成质量的新突破,为复杂场景下的轨迹控制提供了更精准的解决方案。
  4. +
+

AI行业展望与社会影响

+
    +
  1. 近日,美国犹他州律师理查德・贝德纳因在法庭文件中引用 ChatGPT 生成的虚假案例,被法院处以罚款,再次引发了对 AI 在法律领域应用的广泛争议。此事件深刻提醒法律从业者,在使用新兴技术时,务必保持严谨的审核责任,确保法律文件的准确性。
    图片
  2. +
  3. OpenAI 计划在2025年上半年将 ChatGPT 打造为具备 T 型技能 的"超级助手”,旨在挑战苹果 Siri 的市场地位。这份战略文件透露,OpenAI 不仅希望 ChatGPT 成为能处理日常琐事和复杂任务的智能伙伴,更呼吁用户能在所有平台上自由选择默认 AI 助手,推动 AI 市场更加开放。
  4. +
+

开源TOP项目

+
    +
  1. nautilus_trader (Link) 是一个拥有 6728 Star高性能算法交易平台事件驱动回测器,为开发者提供强大的交易策略验证能力。
  2. +
  3. data-engineer-handbook (Link) 拥有 28669 Star,是一个旨在帮助用户学习数据工程的综合性资源仓库,汇集了所有相关学习链接。
  4. +
  5. postiz-app (Link) 是一个坐拥 20460 Star终极社交媒体日程安排工具,集成了大量 AI 功能,旨在简化社交媒体管理。
  6. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/daily/2025-06-04.html b/today/book/daily/2025-06-04.html new file mode 100644 index 0000000..efc544e --- /dev/null +++ b/today/book/daily/2025-06-04.html @@ -0,0 +1,256 @@ + + + + + + 06-04-日刊 - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025年6月4日

+

AI产品与功能更新

+
    +
  1. Komiko平台近日推出视频到视频功能,利用AI技术将用户上传的视频一键转换为动漫、漫画等多样化艺术风格的动态内容,极大降低了动画创作的门槛。该功能通过深度整合先进AI模型,并提供AI线稿上色、动画补帧等工具,旨在加速创意产业的数字化转型,成为专业人士和爱好者的首选创作工具。 +
    图片
  2. +
  3. 蚂蚁集团的**"AI健康管家”成功通过信通院医疗健康行业大模型可信评估**,成为首批获认可的产品之一,进一步提升了其在医疗AI领域的可靠性。该产品已服务超4000万用户,提供预约医生、健康评估、报告解读等智能健康服务,并吸引了60多位知名医生AI智能体入驻,未来将持续扩展功能。 +
    图片
  4. +
+

AI前沿研究

+
    +
  1. AI"教父”约书亚・本吉奥成立非营利组织LawZero,投入3000万美元启动资金,旨在开发**"科学家 AI”系统以防范未来AI智能体对人类进行欺骗。该系统将作为AI安全监控的护栏**,确保自身智能程度与所监管AI智能体相当,通过提高AI的透明性和可信性,推动行业向更负责任的方向发展。 +
    图片
  2. +
  3. Play AI开源发布了PlayDiffusion,一款基于扩散模型的语音**"局部修改”工具,能够实现对音频片段的替换、删除或调整而不留痕迹**,极大提升了音频编辑效率和自然度。该技术能以高达50倍的速度提升TTS推理效率,并保持全局一致性,对播客制作、AI配音和内容纠错等场景具有重要意义,有望成为内容创作的必备利器。 +GitHub: PlayDiffusion 模型下载: PlayDiffusion
  4. +
  5. LumosFlow是一个用于长视频生成的新框架,它通过引入运动引导来解决现有方法中时间连贯性不足和过渡不自然的问题。该研究通过分层生成关键帧并分解中间帧插值,实现了高达15倍的插值,确保了生成视频的运动和外观一致性。 +论文URL: LumosFlow
  6. +
+

AI行业展望与社会影响

+
    +
  1. OpenAI以30亿美元收购Windsurf后,用户对其Claude模型访问权限大幅受限,引发开发者普遍不满,严重影响了开发效率与用户体验。此举导致Windsurf用户面临成本增加和操作复杂性,且未能获得Claude4系列直接访问,这可能威胁Windsurf在激烈市场竞争中的未来增长。 +
    图片
  2. +
+

开源TOP项目

+
    +
  1. RedditVideoMakerBot (⭐7672) 是一个开源项目,旨在通过一条命令简化Reddit视频的创建过程,极大地降低了用户制作视频的门槛。 +项目URL: RedditVideoMakerBot
  2. +
  3. cursor-free-vip (⭐28687) 是一款专为Cursor AI设计的工具,能够自动重置机器ID,从而免费升级并绕过其Pro功能中的高代币限制和试用请求限制。该项目有效解决了用户在Cursor AI使用过程中遇到的免费试用账户限制问题。 +项目URL: cursor-free-vip
  4. +
+

科技博主观点

+
    +
  1. 科技博主大帅老猿指出,通过重新讲述学到的知识并录制视频来卖课是常见操作,但标榜原创的行为只可能欺骗新手。他强调检验原创的唯一真理举报、投诉、打官司,只有能让侵权内容下架或获得赔偿,才有资格自称原创。 +Tweet Link
  2. +
  3. 博主ginobefun推荐了一篇关于复杂RAG架构演进的InfoQ文章,该文章深入探讨了跨模态知识联邦统一语义推理的实践。文章提出通过融合知识库统一知识图谱解决传统RAG在处理异构、多模态知识时的挑战,并通过医疗和金融案例展示了其应用价值。 +
    图片

    图片

    图片
    文章链接:文章
  4. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/daily/2025-06-05.html b/today/book/daily/2025-06-05.html new file mode 100644 index 0000000..e960b96 --- /dev/null +++ b/today/book/daily/2025-06-05.html @@ -0,0 +1,248 @@ + + + + + + 06-05-日刊 - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025/6/5

+

AI产品与功能更新

+
    +
  1. Suno 近日升级了其AI音乐编辑工具,允许用户上传和混音未完成的作品,并能修改歌词和延长曲目时长至八分钟,同时引入了创意滑块等功能。
    图片
    此次升级正值其面临主要唱片公司的版权诉讼,唱片公司希望引入类似于 YouTube Content ID 的技术来追踪 AI 平台上的音乐使用情况。
  2. +
  3. OpenAI 近日宣布 ChatGPT 升级新功能,现可连接 OutlookTeamsGmail 等多个外部服务,旨在提升企业用户的协作和信息获取效率。
    图片
    此外,macOSChatGPT Team 用户还新增了"录制模式”,能自动生成会议记录和待办事项。
  4. +
  5. AI驱动的代码编辑器 Cursor 于近日正式发布1.0版本,引入了核心功能 BugBot,能自动化审查 GitHub 上的 Pull Request 并一键修复代码。
    图片
    该版本还全面开放了后台代理功能,并增加了 Jupyter 支持和"Memories”项目管理功能,旨在显著提升开发者的生产力。
  6. +
  7. 腾讯公益近日推出了创新性的"问 AI”功能,首次将大型人工智能模型应用于公益领域,旨在提升公众与公益项目及机构之间的互动和透明度。
    图片
    这一便捷的沟通方式有助于公众更深入地理解并参与公益事业,并有望推动公益事业的进一步发展。
  8. +
+

AI前沿研究

+
    +
  1. 这项研究提出 SuperWriter-Agent 框架,通过引入结构化的思考、规划和完善阶段,显著提升了大型语言模型在生成长文本时的连贯性和质量。
    基于此框架训练的 SuperWriter-LM 在多项基准测试中表现出领先水平,证明了这种反思驱动方法能够让模型像专业作家一样,生成更高质量和一致性的长篇内容:Link
  2. +
+

AI行业展望与社会影响

+
    +
  1. OpenAI 首席执行官 山姆・奥尔特曼 指出,AI 正逐渐被企业视为基层员工,导致科技公司初级职位招聘量在2023至2024年间下降了25%。
    图片
    专家预测,到2030年 AI 可能取代多达3.75亿个工作岗位,甚至未来1到5年内可能淘汰一半的初级白领岗位,引发高达20%的失业率。
  2. +
+

开源TOP项目

+
    +
  1. HowToCook 是一个专为程序员设计的居家烹饪方法指南,旨在解决程序员做饭难的问题。该项目目前已获得 87530Star,内容仅限简体中文,提供详细的烹饪指导:Link
  2. +
  3. system-design-primer 是一项旨在帮助学习如何设计大规模系统并准备系统设计面试的开源项目,已获得 304096Star。它提供了全面的学习资源,并包含 Anki 抽认卡辅助学习:Link
  4. +
  5. ChinaTextbook 项目致力于收集中国所有小学、初中、高中及大学的 PDF教材,为学生和教师提供免费的教育资源。这个实用的资料库已获得 35875StarLink
  6. +
  7. Firecrawl 近日发布了突破性的 /search API,允许开发者通过一次API调用实现网页搜索与内容抓取,并以 AI友好 的多种格式输出数据。
    图片
    这一功能极大简化了 AI 应用的数据获取流程,无需第三方依赖,提升了数据处理效率,并在 GitHub 上已获得超过10K的 Star
  8. +
+

社媒分享

+
    +
  1. Gorden Sun 分享了一套能生成"超级赞”图文效果的 AI 提示词,并推荐使用 GPT4oClaude-3.7DeepSeek-V3 等工具。
    Image
    他指出,这些提示词虽然易于使用,但原作者在整理上花费了心思:Link
  2. +
  3. 推主 wwwyesterday 将现代学术论文比作 npm 包管理系统,认为两者都存在论文/包数量庞大、引用/依赖层层叠叠的现象,且大部分价值不高,少数经典广为引用。
    他指出,现在很少有人能完全从零开始原创,就像写东西离不开 package.json,但他仍会刷 arxiv 寻找新观点:Link
  4. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/daily/2025-06-06.html b/today/book/daily/2025-06-06.html new file mode 100644 index 0000000..ee8a9db --- /dev/null +++ b/today/book/daily/2025-06-06.html @@ -0,0 +1,254 @@ + + + + + + 06-06-日刊 - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025/6/6

+

AI产品与功能更新

+
    +
  1. Pollo AI 推出了一站式AI图像与视频生成平台,整合全球前沿模型如Google Veo 3、Kling等,提供文字转视频、图像风格化、角色一致性等多种功能,并支持API接入,相比同类平台更具成本和模型优势,且获得Google Cloud的Veo 3模型授权。 +
    图片
  2. +
  3. Luma Labs 发布了全新的AI视频编辑工具 Modify Video,基于其Dream Machine平台和Ray2模型,用户能通过文本提示对视频进行风格重塑、场景替换和角色调整,大幅降低了传统视频制作的复杂性和成本。该工具凭借Ray2模型的强大能力,在动作流畅性和时间一致性方面表现出色,并降低了创意门槛。 +
    图片
  4. +
  5. 谷歌更新了Gemini 2.5版本,显著提升了AI音频对话与生成技术,使其成为一个能够原生理解和生成文本、图像、音频、视频和代码的多模态AI系统。新功能使得人机交流更加自然流畅,支持实时音频对话、风格控制和多语言,并通过可控的文本转语音技术,允许用户精确调整语音输出的语调和情感。 +
    图片
  6. +
  7. 热门手游《逆水寒》与可灵AI合作,在游戏内推出了全新的"图生动图”玩法,让玩家能够通过简单操作将静态图片转化为个性化动态画面。该功能支持用户截图或上传图片,通过输入描述词来生成动图,并可进行双人互动创作,提升了玩家的游戏体验。 +
    图片
  8. +
+

AI前沿研究

+
    +
  1. NVIDIA 发布了Llama-3.1-Nemotron-Nano-VL-8B-V1,这是一款基于Llama-3.1架构的8B参数视觉语言模型,支持图像、视频和文本输入,并能输出高质量文本及具备强大的图像推理能力。该模型在OCR和文档智能方面表现卓越,通过AWQ4bit量化技术可在单张RTX GPU上高效部署,并已在Hugging Face平台开源,为开发者提供了轻量高效的多模态AI解决方案。 +
    图片
  2. +
  3. Voyager 是一种新颖的视频扩散框架,它能从单张图片和用户定义的摄像机路径,生成世界一致的3D点云序列,特别适用于游戏和虚拟现实中可探索的3D场景。这项技术通过联合生成对齐的RGB和深度视频序列,实现了帧间固有的3D一致性,显著提升了视觉质量和几何精度。论文地址:https://arxiv.org/abs/2506.04225
  4. +
+

AI行业展望与社会影响

+
    +
  1. 硅谷投资人Mary Meeker的最新AI报告指出,全球AI竞争格局正经历深刻重塑,中国AI力量与开源浪潮正全面崛起,挑战OpenAI等头部公司的主导地位。报告强调,中国AI模型性能已逼近国际一线,并在制造业中展现出强大的产业融合能力,同时开源模型凭借低成本和高灵活性,市场份额迅速增长,预示着AI行业进入多极对抗新时代。 +
    图片
  2. +
+

开源TOP项目

+
    +
  1. netbird 是一个拥有 14029 颗星的开源项目,它基于 WireGuard® 帮助用户将设备连接到安全的覆盖网络,并支持SSOMFA和精细的访问控制,提供安全高效的网络连接。项目地址:https://github.com/netbirdio/netbird
  2. +
  3. quarkdown 是一个拥有 3952 颗星的开源项目,旨在为 Markdown 文本赋予"超能力”,将想法轻松转化为演示文稿、文章和书籍等多种形式。项目地址:https://github.com/iamgio/quarkdown
  4. +
  5. cognee 是一个拥有 2658 颗星的开源项目,其核心功能是仅用 5 行代码即可实现 AI 智能体的记忆,极大简化了智能体开发中的复杂性。项目地址:https://github.com/topoteretes/cognee
  6. +
+

社媒分享

+
    +
  1. @wwwyesterday 分享了一个关于与 AI 对话的"生活小妙招”,即在开始时让AI每次回复都称呼"哥哥”,一旦AI停止这样称呼,就意味着可以新开对话窗口了。这个小技巧巧妙地利用了AI的"记忆”机制,为用户提供了判断对话是否需要重新开始的依据。
  2. +
  3. Gorden Sun 宣布 Fish Audio 已开源其 S1-mini语音模型,作为表现良好的S1模型的精简版(0.5B参数)。S1-mini可供个人免费部署使用,但不可商用。在线体验及模型链接:https://huggingface.co/spaces/fishaudio/openaudio-s1-mini https://huggingface.co/fishaudio/openaudio-s1-mini
  4. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/daily/2025-06-07.html b/today/book/daily/2025-06-07.html new file mode 100644 index 0000000..b1a7161 --- /dev/null +++ b/today/book/daily/2025-06-07.html @@ -0,0 +1,249 @@ + + + + + + 06-07-日刊 - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025/6/7

+

AI产品与功能更新

+
    +
  1. 近日,德国科技巨头博世阿里云合作,将通义大模型应用于智能座舱,通过云计算与端侧混合计算实现与3D 数字人的交互,提升座舱智能感知和多模态控制能力。该方案支持知识问答和同声传译,使智能座舱成为理解并满足用户需求的智能助手,标志着汽车行业正迈向个性化、智能化的移动空间。
  2. +
  3. Perplexity AI近日推出SEC文件访问功能,旨在帮助各类投资者在Perplexity 平台轻松查询和理解复杂的财务文档,所有答案均附有引用。此外,Perplexity还推出了"实验室”功能,该功能能够将用户的提示转化为报告、仪表板等完整项目,显著提升了工作流效率。
  4. +
  5. Trae 平台近日更新,正式集成GoogleGemini 2.5 Pro Preview模型,该模型在WebDev ArenaLMArena 编码排行榜中均位列第一,显著提升了前端开发与UI 设计能力。
    图片
    此次升级优化了代码转换、编辑及复杂代理工作流,并已免费向用户开放,有望推动AI区块链去中心化应用领域的创新。
  6. +
  7. 海外知名的AI 视频生成平台 PixVerse正式推出其国内版"拍我AI”,同步上线移动端 App 和网页版,旨在为国内内容创作者和企业提供高效便捷的AI 视频生成工具
    图片
    "拍我AI”支持通过文本或图像一键生成高质量、多风格视频,依托 PixVerse V4.5 算法并进行了本地化优化,有望推动中国市场AI 视频技术的普及和应用。
  8. +
  9. ElevenLabs于2025年6月5日发布了被誉为"地表最强”的文本转语音(TTS)模型Eleven v3 (Alpha 版),该模型不仅能将文本转化为自然流畅的语音,还能通过音频标签精确控制情感、语速甚至加入音效,实现"演技合成”。
    图片
    图片
    它支持70多种语言多角色自然对话,并通过自动标签功能简化创作,有望在影视配音虚拟助手等领域广泛应用,重新定义AI 语音的未来。
  10. +
+

AI前沿研究

+
    +
  1. 这篇研究论文介绍了一种名为动态内存稀疏化(DMS)的新方法,它通过压缩Transformer LLMKV 缓存,在推理时实现超扩展,从而在相同计算资源下生成更多 Token 并提高模型准确性。该方法仅需少量训练步骤即可实现高压缩率,并显著提升了如Qwen-R1 32B等多种LLMAIME 24GPQALiveCodeBench等基准测试上的准确性。论文地址:https://arxiv.org/abs/2506.05345
  2. +
+

AI行业展望与社会影响

+
    +
  1. 宇树科技 CEO 王兴兴在第七届北京智源大会上表示,公司始终坚持的终极目标是让机器人实现家庭和工业场景的实用化工作,而跳舞和格斗等具身智能展示仅是训练和技术验证的手段。
    图片
    他透露,今年上半年人形机器人在商业租赁市场已初具规模并带来可观价值,未来将加速机器人实用化落地。
  2. +
  3. 知名科技博主王自如B站宣布复更,并正式更名为"王自如AI”,表示将以AI 测评 UP 主的身份开启二次创业,专注于AI 内容创业AI 应用,助力传统产业数字化转型。
    图片
    他在视频中感谢了董明珠雷军的鼓励和帮助,并提及此前入职格力是为重塑销售体系。
  4. +
+

开源TOP项目

+
    +
  1. note-gen是一款AI 赋能的跨平台Markdown 笔记应用(Stars: 3161),致力于利用AI将碎片化知识整理成可读笔记,连接记录与写作。项目地址:https://github.com/codexu/note-gen
  2. +
  3. notebooks项目(Stars: 1174)提供了通过Google ColabKaggle等平台引导式Notebook免费微调大型语言模型的功能。项目地址:https://github.com/unslothai/notebooks
  4. +
  5. ragbits(Stars: 749)提供了一系列构建模块,旨在帮助开发者快速开发生成式 AI 应用程序。项目地址:https://github.com/deepsense-ai/ragbits
  6. +
+

社媒分享

+
    +
  1. 知名博主歸藏推荐即梦AI图片3.0的智能参考功能,该功能支持用户基于上传图像生成任何内容,并能修改照片背景、添加配饰、更改姿势,甚至精确添加或修改复杂文字效果
    Image
    这一突破性能力极大地提升了日常照片分享的表现力,并能高效生成电商产品图、小红书和视频封面等营销物料。文章链接:https://mp.weixin.qq.com/s/_kt9OLylR95sG7U37wseSw,社交媒体链接:https://m.okjike.com/originalPosts/6842cd91a26304532600fa4d
  2. +
  3. Yangyi分享了AI 时代的产品价值公式,指出产品价值取决于"新体验”(获得有效结果与美观度)和"迁移成本”(旧平台数据沉没成本与上手门槛)之间的差异。因此,构建高价值AI 产品需要提供超预期的有效结果、足够美观的界面,并致力于降低用户数据迁移的难度和产品的使用门槛。社交媒体链接:https://x.com/Yangyixxxx/status/1930912029809979654
  4. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/daily/2025-06-08.html b/today/book/daily/2025-06-08.html new file mode 100644 index 0000000..3415cee --- /dev/null +++ b/today/book/daily/2025-06-08.html @@ -0,0 +1,241 @@ + + + + + + 06-08-日刊 - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025/6/8

+

AI产品与功能更新

+
    +
  1. 阿里巴巴于6月6日正式开源了全新的千问3向量模型系列Qwen3-Embedding,其在文本检索、聚类和分类等任务上的性能提升超40%,并超越谷歌和OpenAI的顶尖模型,获得了同类模型的最佳性能(SOTA),同时具备强大的多语言支持能力。
    图片
    该系列共9款模型,已在魔搭社区、Hugging Face和GitHub等平台开源,并可通过阿里云百炼使用API服务,为全球开发者提供了更高效的AI应用空间。
  2. +
  3. AI驱动的本地视频编辑工具Diffusion Studio Pro正式亮相,该产品被誉为"CapCut + Cursor”结合,以本地优先、浏览器为基础的非线性编辑体验,集成了超过16种生成式AI模型,旨在降低创作门槛并大幅提升专业视频创作者的工作效率。其提供免费无限层级,有望成为AI驱动视频编辑的行业标杆,为创作者带来更高效、直观的创作体验。
  4. +
  5. 谷歌于6月5日发布了名为Portraits的创新AI产品,用户可通过与虚拟专家进行实时对话,获得个性化的沟通技巧与领导力学习体验,首批虚拟专家基于知名畅销书作者打造。
    图片
    该产品依托谷歌先进的生成式AI技术,强调交互性和实践性,目前仅对美国IP用户开放测试,预示着AI教育将迈向更互动、更个性化的新阶段。
  6. +
+

AI前沿研究

+
    +
  1. 在第七届"北京智源大会”上,智源研究院重磅推出了一系列名为"悟界”的大模型,其中包括原生多模态世界模型Emu3、脑科学多模态通用基础模型见微Brainμ,以及具身智能的协作框架RoboOS2.0RoboBrain2.0等。
    图片
    这些模型旨在推动人工智能在医疗、教育、环境监测等多个重要领域的应用落地,展现了智源研究院在多模态智能技术方面的雄心和实力。
  2. +
+

开源TOP项目

+
    +
  1. react-bits是一个拥有12729星的开源React组件集合,它提供动画、交互式且完全可定制的组件,旨在帮助开发者构建出令人惊叹且难以忘怀的用户界面。项目地址:Link
  2. +
  3. art-design-pro是一个拥有1729星的Vue 3管理后台模板,它采用Vite + TypeScript + Element Plus构建,专注于优化用户体验和视觉设计。项目地址:Link
  4. +
+

社媒分享

+
    +
  1. 刘勿锋分享了用Claude画图时的一个实用小技巧:通过简单的提示词,可以指导Claude调用如iconfontLucied React图标库等第三方图标库,而非使用系统默认的emoji,从而大幅提升前端网页的视觉美观度和风格统一性。
    图片

    图片
    更多详情请访问:Link
  2. +
  3. wwwgoubuli预估接下来社交媒体上将出现两种热门内容:一部分是深入分析作文题目的讨论,另一部分则是围绕AI写作文展开的创作比拼,展现了对当前AI应用趋势的敏锐观察。更多信息:Link
  4. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/daily/2025-06-09.html b/today/book/daily/2025-06-09.html new file mode 100644 index 0000000..8037d2c --- /dev/null +++ b/today/book/daily/2025-06-09.html @@ -0,0 +1,247 @@ + + + + + + 06-09-日刊 - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025/6/9

+

AI产品与功能更新

+
    +
  1. OpenAI 宣布 ChatGPT 高级语音功能升级,显著提升了语音交互的自然性和流畅度,使其语调更自然、节奏更真实、情绪表达更丰富,并加入了双向自动翻译功能,能持续进行多轮对话翻译,无需重复指令,特别适用于国际出行、远程办公和语言学习等场景。
  2. +
  3. 面壁智能于6月6日发布了 MiniCPM 4.0系列 模型,包括8B稀疏版和0.5B轻巧版,在端侧性能上实现了极限情况下220倍、常规5倍的速度提升,通过系统级稀疏创新和高效双频换挡技术,大幅减少了端侧存储需求,并已成功适配Intel、高通等主流芯片。 +
    图片
  4. +
+

开源TOP项目

+
    +
  1. tensorzero (Link) 是一款拥有4869个Star的项目,它为LLM应用创建了一个反馈循环,旨在将生产数据转化为更智能、更快、更经济的模型。
  2. +
  3. HumanSystemOptimization (Link) 是一个拥有15170个Star的项目,提供了一份名为"健康学习到150岁”的人体系统调优指南
  4. +
  5. omni-tools (Link) 拥有2940个Star,它提供了一套自托管的网页工具集,用于日常任务,强调无广告、无跟踪,且可在浏览器中快速便捷使用。
  6. +
  7. BlackFriday-GPTs-Prompts (Link) 是一个拥有7018个Star的项目,提供了无需Plus订阅即可使用的免费GPTs列表
  8. +
+

社媒分享

+
    +
  1. ginobefun分享了关于 RAG技巧与底层代码剖析 的文章(Link),强调通过手写代码理解RAG核心逻辑,并详细介绍了语义分块上下文增强检索如何提升大模型问答质量。
  2. +
  3. 黄赟认为 AI数字人 将成为电商平台的标配(Link),并提到近期AI主播被"开发者模式”玩坏的现象,导致技术服务商需紧急修复漏洞。
  4. +
  5. 歸藏展示了 FLUX kontext 在修改汽车宣传图方面的强大能力(Link),能将汽车背景更换为黄昏沙滩或赛道,并智能地为行驶中的车轮添加运动模糊效果。 +
    图片
    +
    图片
  6. +
  7. izx-copy分享了Google的建议(Link),鼓励开发者直接使用其高质量的深度研究代码库,而非自行开发,认为其比"vibe coding”版本更优。 +
    图片
  8. +
  9. Yangyi呼吁开发 "睿智的AI” (Link),即能够快速识别幻觉和虚假信息的AI,并提出了AI幻觉专家网络的概念,认为这能帮助AI自主辨别信息真伪,提升输出可靠性。
  10. +
  11. pimgeek转发了一篇关于公司用ChatGPT替代客服导致翻车的文章(Link),文章指出用户更倾向于与真人客服沟通,数据显示多数用户不希望产品引入AI客服,甚至会因此考虑更换竞争对手。 +
    图片
  12. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/daily/2025-06-10.html b/today/book/daily/2025-06-10.html new file mode 100644 index 0000000..d50056e --- /dev/null +++ b/today/book/daily/2025-06-10.html @@ -0,0 +1,286 @@ + + + + + + 06-10-日刊 - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025/6/10

+

AI产品与功能更新

+
    +
  1. +

    Google 近日调整 AI 模型使用政策,自5月起,Google AI Studio 已停止向免费用户提供 Gemini 2.5 Pro 系列模型调用权限,未来开发者需自行提供 API 密钥接入服务。此举引发了开发者社区的广泛关注,分析认为这是 Google 推动 Gemini 商业化进程、将高性能模型纳入付费体系的信号。 +
    图片

    +
  2. +
  3. +

    据官方数据显示,阿里旗下通义千问3大模型开源仅一个月,其全球累计下载量已突破1250万次,并在 Hugging Face 等主流 AI 开源平台上,衍生模型数量超过13万个,跃居全球第一。这一爆发式增长不仅代表着国产大模型的开源实力正与国际水平接轨,也进一步巩固了阿里在全球 AI 基础模型生态中的影响力。 +
    图片

    +
  4. +
  5. +

    轻量级文档解析模型 MonkeyOCR 近日震撼登场,它以仅3B参数的轻量级架构,在英文文档解析任务中展现出惊艳性能,超越了 Gemini 2.5 Pro 等重量级模型,并大幅提升了处理速度。其核心创新在于采用"结构-识别-关系”三元组范式,这不仅提升了解析准确率,还显著降低了计算资源需求,为中小型企业部署 AI 文档解析解决方案提供了可能。 +
    图片
    +论文链接:https://arxiv.org/abs/2506.05218

    +
  6. +
  7. +

    在近期一场采用2025年高考新课标Ⅰ卷客观题的数学挑战中,字节豆包腾讯元宝表现出色,以68分的成绩并列第一,充分展现了其在复杂推理场景下的潜力。此次比赛不仅揭示了各大 AI 模型在高考数学上的能力与不足,也反映出它们在细节处理、公式应用和逻辑推理方面的显著进步,为未来 AI 数学能力的发展奠定了基础。 +
    图片
    +
    图片

    +
  8. +
+

AI行业展望与社会影响

+
    +
  1. +

    架构师罗伯特・卡鲁索近日进行了一项跨时代实验,结果显示1977年推出的Atari 2600游戏机国际象棋引擎轻松击败了 OpenAIChatGPTChatGPT 在比赛中频繁犯错、混淆棋子,这引发了公众对复古科技现代 AI 棋艺水平的讨论和反思。 +
    图片

    +
  2. +
  3. +

    博主 wwwgoubuli 认为 AI 编程代理正进入平台期,尽管当前模型如 Gemini 2.5 ProClaude 表现强劲,但模型层面的"飞升”空间有限。他预计未来将有更多产品井喷式发展,而重点在于载体媒介IDE/plugin 等方面的完善,而非核心模型能力的突破。 +Link

    +
  4. +
+

开源TOP项目

+
    +
  1. +

    vosk-api 是一个拥有10342颗星的开源项目,它提供适用于 AndroidiOS树莓派和服务器的离线语音识别 API,并支持 PythonJavaC#Node 等多语言开发。 +Link

    +
  2. +
  3. +

    RAG_Techniques 是一个拥有17002颗星的开源项目,该仓库展示了检索增强生成(RAG)系统的各种先进技术。它结合了信息检索生成模型,旨在为用户提供更加准确且上下文丰富的 AI 回复。 +Link

    +
  4. +
  5. +

    Seelen-UI 是一个拥有7257颗星的开源项目,它提供了一个完全可定制桌面环境,专为 Windows 10/11 用户设计,让用户能够打造个性化的操作界面。 +Link

    +
  6. +
  7. +

    Meng Shao 分享了5个精选的开源项目,旨在帮助 AI 工程师提升技能并获得"超能力”,尤其是在 LLMs 和生成式 AI Agent 领域。这些项目涵盖了从 LLM 基础知识、AI Agent 构建、生产级机器学习应用部署到提示工程等关键学习资源。 +
    图片
    +Link

    +
  8. +
+

社媒分享

+
    +
  1. +

    博主归藏详细介绍了如何在 Liblib 平台在线使用 FLUX Kontext 工具进行图片修改,无需本地运行 Comfyui,并分享了涵盖单图、双图、三图融合及图片放大功能的工作流Liblib 上线的 Kontext 提供了便捷的在线处理能力,旨在帮助用户轻松掌握图片创作的各种高级技巧。 +
    图片
    +Link

    +
  2. +
  3. +

    Tw93 推荐了 PayQrcode 方案,该方案通过物理图片合并技术,成功将微信支付宝收款码融合为单张图片,实现了线下离线场景下的双码兼容识别。这项创新解决了传统双码不便的问题,并经本地测试证明识别效果良好,极大地提升了支付便利性。 +
    图片
    +Link

    +
  4. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/daily/2025-06-11.html b/today/book/daily/2025-06-11.html new file mode 100644 index 0000000..3ba7794 --- /dev/null +++ b/today/book/daily/2025-06-11.html @@ -0,0 +1,272 @@ + + + + + + 06-11-日刊 - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025/6/11

+

AI产品与功能更新

+
    +
  1. 豆包大模型家族将在2025 FORCE原动力大会上,重磅发布全新的豆包·视频生成模型。这款模型可谓"创意魔法棒”,它凭借高效结构和多任务统一建模等黑科技,不仅支持无缝多镜头叙事,还能精准响应多动作,甚至能像专业摄影师一样随心运镜,轻松生成写实、动漫等多种风格的高品质视频,简直是视频创作者的福音! +
    图片
  2. +
  3. xAI开发的Grok人工智能正大刀阔斧地接管X平台的推荐算法,同时优化了评论排序机制。这意味着,平台将优先推荐高质量内容,而非仅仅看粉丝量,这无疑给那些粉丝较少但有真材实料的"小号”和新人带来了前所未有的曝光机会,旨在打造一个更公平、更开放的内容生态,让好内容不再"蒙尘”。 +
    图片
  4. +
  5. 豆包App近期也对"一句话P图”功能进行了全面升级,它基于强大的SeedEdit 3.0模型,新增了一键添加/替换文字、质感风格迁移和局部图像编辑增强等一系列酷炫修图玩法。这波升级简直是把专业修图师请进了手机,让普通用户也能无需专业技能,轻松搞定个性化照片创作,让"修图小白”也能变身"修图大师”。 +
    图片
  6. +
  7. 苹果在WWDC 2025大会上带来了iOS 26系统的"杀手级”功能——视觉智能。有了它,你可以在屏幕上的任何图片或信息上进行提问、搜索,甚至自动识别事件详情,简直是手机的"智能眼”。这项升级通过AI技术实现了屏幕内容的"一眼识别”,大大提升了交互体验的便捷性与智能化程度,还能自动提取事件信息加入日历,让你的数字生活更加省心。 +
    图片
  8. +
  9. 好消息!沉浸式翻译迎来重大更新,现在已能对推特(X)视频进行实时翻译。即便视频没有原生字幕,它也能帮你"神同步”地显示中英双语字幕。这下,刷X平台视频再也不用担心语言不通了,简直是跨文化交流的"神助攻”,彻底消除了语言障碍,让世界更近。 +Link
  10. +
+

AI前沿研究

+
    +
  1. 香港大学和华为诺亚方舟实验室强强联手,推出了颠覆性的FUDOKI模型。这款模型采用非掩码离散流匹配架构,成功突破了传统自回归模型的束缚,实现了更加灵活高效的多模态生成与理解能力。它通过独特的并行去噪机制,显著提升了复杂推理和生成任务的表现,尤其在图像生成方面表现惊艳,为未来通用人工智能的发展铺平了道路。 +
    图片
  2. +
  3. 香港科技大学和快手科技的研究团队联合发布了EvoSearch(进化搜索)技术,这简直是AI作画领域的一股清流!它彻底颠覆了以往"大模型、大算力”的固有思维,巧妙地将达尔文的进化论思想融入AI生成过程,让那些"小个子”模型也能生成超越甚至媲美"大块头”的高质量图像和视频。这项突破性技术有望开启AI创作的**"智能进化”时代**,让AI模型在推理阶段释放更深层次的潜力。相关项目主页、代码和论文链接已发布:https://tinnerhrhe.github.io/evosearch/https://github.com/tinnerhrhe/EvoSearch-codeshttps://arxiv.org/abs/2505.17618。 +
    图片
    +
    图片
  4. +
  5. 一篇名为"玩中泛化:通过游戏学习推理”的学术论文揭示了令人兴奋的发现:多模态大型语言模型(MLLMs)通过玩简单的街机游戏,竟然能显著提升其跨领域的多模态推理能力,甚至超越了在特定数据上训练的专业模型!这无疑为未来通用AI能力的培养指明了一条充满趣味的新方向,让AI在"玩乐”中变得更聪明。 +此链接
  6. +
  7. 新论文《梦境之地》(Dreamland)提出了一种结合物理模拟器与大型生成模型的混合框架。它的目标是创造出高度可控且逼真的动态虚拟世界,不仅显著提升了图像质量与可控性,更重要的是,有望为具身AI智能体的训练提供一个理想的"游乐场”和"实验室”,助力AI在现实世界中更好地学习和行动。 +Link
  8. +
+

AI行业展望与社会影响

+
    +
  1. 理想汽车近期进行了组织架构的"大变身”,正式成立了**"空间机器人”"穿戴机器人”两个全新的二级部门。这不仅仅是部门调整,更预示着理想汽车正从传统的汽车制造商转型为智能出行生态构建者**。他们旨在通过机器人技术,构建一个涵盖车内"第三空间”和车外智能穿戴设备的完整智能生活服务体系,这无疑将为理想汽车在竞争激烈的市场中带来新的差异化优势,让"第三空间”战略不再只是一个概念。 +
    理想汽车
  2. +
  3. 俄亥俄州立大学宣布从今年起,将强制所有学生接受人工智能(AI)培训,这简直是为未来职场"量身定制”的技能包!学校推出了**"AI流利度”计划**,将AI教育全面融入本科生课程,旨在培养学生将专业知识与AI技术有效结合的能力。当然,学校也强调学生不得利用生成性AI来"蒙混过关”,同时加强教师培训以维护学术诚信。此举旨在确保每位毕业生都能在其专业领域有效应用AI,并积极响应俄亥俄州AI教育联盟在K-12教育中推动AI教育的努力,让AI真正成为每个人的"超级助手”。 +
    学习 考试 高考 教育 (1)
  4. +
  5. 知名思考者李继刚一针见血地指出,当AI技术变得越发高效强大时,人类的判断力品味和对事物目的的理解反而会变得更为硬核。因为AI虽然能生成万千方案并完美执行,却无法替代人类进行选择、定义,更无法洞悉复杂且深邃的人性。这提醒我们,在AI时代,真正有价值的,或许正是那些AI无法企及的"人类专属技能”。 +Link
  6. +
+

开源TOP项目

+
    +
  1. 小红书的 hi lab 团队近日献出了一份"大礼”——首个开源文本大模型dots.llm1!这款拥有1420亿参数的混合专家(MoE)语言模型,在海量真实数据训练后,其性能竟然能媲美阿里巴巴的Qwen2.5-72B,这简直是模型界的"黑马”!此次开源不仅彰显了小红书在人工智能领域的技术雄心,更旨在提供更智能化的服务,并激励开发者们一起加入AI研究的"大合唱”。 +
    图片
  2. +
  3. 近期,GitHub上两个AI相关的项目人气爆棚。其中,拥有10785星的"newsnow”项目,它旨在为用户提供优雅的实时热点新闻阅读体验,让信息获取既便捷又高效,简直是"新闻控”的福音,地址在这里:此链接。另一个是"GenAI_Agents”项目,以12884星的高热度,为开发者提供了从基础到高级的生成式AI智能体技术教程与实现,旨在赋能构建更智能的交互式AI系统,详情可访问:此链接
  4. +
+

社媒分享

+
    +
  1. Gorden Sun在社交媒体上分享了Mirage虚拟人模型产品,这款产品简直是"数字分身”的魔法师!它能通过音频驱动,生成生动、嘴型同步且表情丰富的虚拟人视频,栩栩如生。Gorden Sun还特别强调,该产品的详细技术报告对研究人员具有极高的参考价值,看来又将引发一场虚拟人技术的"军备竞赛”。 +Link
  2. +
  3. Sam Altman在X平台发文宣布,o3产品价格已大幅下调80%,这简直是"福利大放送”!他表达了对用户创新使用的期待,并预告了o3-pro版本也将提供令人满意的定价。看来,Sora之父又在鼓励大家放开手脚,用更低的成本去探索AI的无限可能了。 +Link
  4. +
  5. Ryan ᵐᶠᵉʳ 🦄d/acc抛出了一个关于下一代创业者的深刻观点:他们不应被束缚于模仿乔布斯等前代成功模式,也不应受限于有限的低质量输入,而应忠于自我,以独特的"vibe”和玩乐精神自由探索。这就像在说,别做别人的影子,去创造属于你自己的"游戏规则”! +Link
  6. +
  7. 用户wwwgoubuli分享了AI在实际工作中的一个有趣转变。他提到,远程团队成员初时因担心被视为偷懒而不敢充分使用AI,但在他多次分享AI"正确用法”后,团队逐渐"放开手脚”,结果代码的注释、规范和质量均显著提升,同事们也展现出更高的自信。这简直是AI赋能团队效率提升的"教科书式”案例,打破了心中的"AI焦虑”。 +Link
  8. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/elasticlunr.min.js b/today/book/elasticlunr.min.js new file mode 100644 index 0000000..94b20dd --- /dev/null +++ b/today/book/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o + + + + diff --git a/today/book/fonts/OPEN-SANS-LICENSE.txt b/today/book/fonts/OPEN-SANS-LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/today/book/fonts/OPEN-SANS-LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/today/book/fonts/SOURCE-CODE-PRO-LICENSE.txt b/today/book/fonts/SOURCE-CODE-PRO-LICENSE.txt new file mode 100644 index 0000000..366206f --- /dev/null +++ b/today/book/fonts/SOURCE-CODE-PRO-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/today/book/fonts/fonts.css b/today/book/fonts/fonts.css new file mode 100644 index 0000000..698e1e1 --- /dev/null +++ b/today/book/fonts/fonts.css @@ -0,0 +1,100 @@ +/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */ +/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */ + +/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), + url('../fonts/open-sans-v17-all-charsets-300.woff2') format('woff2'); +} + +/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 300; + src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'), + url('../fonts/open-sans-v17-all-charsets-300italic.woff2') format('woff2'); +} + +/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), + url('../fonts/open-sans-v17-all-charsets-regular.woff2') format('woff2'); +} + +/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 400; + src: local('Open Sans Italic'), local('OpenSans-Italic'), + url('../fonts/open-sans-v17-all-charsets-italic.woff2') format('woff2'); +} + +/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 600; + src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), + url('../fonts/open-sans-v17-all-charsets-600.woff2') format('woff2'); +} + +/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 600; + src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'), + url('../fonts/open-sans-v17-all-charsets-600italic.woff2') format('woff2'); +} + +/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), + url('../fonts/open-sans-v17-all-charsets-700.woff2') format('woff2'); +} + +/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 700; + src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), + url('../fonts/open-sans-v17-all-charsets-700italic.woff2') format('woff2'); +} + +/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 800; + src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), + url('../fonts/open-sans-v17-all-charsets-800.woff2') format('woff2'); +} + +/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: italic; + font-weight: 800; + src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'), + url('../fonts/open-sans-v17-all-charsets-800italic.woff2') format('woff2'); +} + +/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */ +@font-face { + font-family: 'Source Code Pro'; + font-style: normal; + font-weight: 500; + src: url('../fonts/source-code-pro-v11-all-charsets-500.woff2') format('woff2'); +} diff --git a/today/book/fonts/open-sans-v17-all-charsets-300.woff2 b/today/book/fonts/open-sans-v17-all-charsets-300.woff2 new file mode 100644 index 0000000..9f51be3 Binary files /dev/null and b/today/book/fonts/open-sans-v17-all-charsets-300.woff2 differ diff --git a/today/book/fonts/open-sans-v17-all-charsets-300italic.woff2 b/today/book/fonts/open-sans-v17-all-charsets-300italic.woff2 new file mode 100644 index 0000000..2f54544 Binary files /dev/null and b/today/book/fonts/open-sans-v17-all-charsets-300italic.woff2 differ diff --git a/today/book/fonts/open-sans-v17-all-charsets-600.woff2 b/today/book/fonts/open-sans-v17-all-charsets-600.woff2 new file mode 100644 index 0000000..f503d55 Binary files /dev/null and b/today/book/fonts/open-sans-v17-all-charsets-600.woff2 differ diff --git a/today/book/fonts/open-sans-v17-all-charsets-600italic.woff2 b/today/book/fonts/open-sans-v17-all-charsets-600italic.woff2 new file mode 100644 index 0000000..c99aabe Binary files /dev/null and b/today/book/fonts/open-sans-v17-all-charsets-600italic.woff2 differ diff --git a/today/book/fonts/open-sans-v17-all-charsets-700.woff2 b/today/book/fonts/open-sans-v17-all-charsets-700.woff2 new file mode 100644 index 0000000..421a1ab Binary files /dev/null and b/today/book/fonts/open-sans-v17-all-charsets-700.woff2 differ diff --git a/today/book/fonts/open-sans-v17-all-charsets-700italic.woff2 b/today/book/fonts/open-sans-v17-all-charsets-700italic.woff2 new file mode 100644 index 0000000..12ce3d2 Binary files /dev/null and b/today/book/fonts/open-sans-v17-all-charsets-700italic.woff2 differ diff --git a/today/book/fonts/open-sans-v17-all-charsets-800.woff2 b/today/book/fonts/open-sans-v17-all-charsets-800.woff2 new file mode 100644 index 0000000..c94a223 Binary files /dev/null and b/today/book/fonts/open-sans-v17-all-charsets-800.woff2 differ diff --git a/today/book/fonts/open-sans-v17-all-charsets-800italic.woff2 b/today/book/fonts/open-sans-v17-all-charsets-800italic.woff2 new file mode 100644 index 0000000..eed7d3c Binary files /dev/null and b/today/book/fonts/open-sans-v17-all-charsets-800italic.woff2 differ diff --git a/today/book/fonts/open-sans-v17-all-charsets-italic.woff2 b/today/book/fonts/open-sans-v17-all-charsets-italic.woff2 new file mode 100644 index 0000000..398b68a Binary files /dev/null and b/today/book/fonts/open-sans-v17-all-charsets-italic.woff2 differ diff --git a/today/book/fonts/open-sans-v17-all-charsets-regular.woff2 b/today/book/fonts/open-sans-v17-all-charsets-regular.woff2 new file mode 100644 index 0000000..8383e94 Binary files /dev/null and b/today/book/fonts/open-sans-v17-all-charsets-regular.woff2 differ diff --git a/today/book/fonts/source-code-pro-v11-all-charsets-500.woff2 b/today/book/fonts/source-code-pro-v11-all-charsets-500.woff2 new file mode 100644 index 0000000..7222456 Binary files /dev/null and b/today/book/fonts/source-code-pro-v11-all-charsets-500.woff2 differ diff --git a/today/book/highlight.css b/today/book/highlight.css new file mode 100644 index 0000000..352c79b --- /dev/null +++ b/today/book/highlight.css @@ -0,0 +1,83 @@ +/* + * An increased contrast highlighting scheme loosely based on the + * "Base16 Atelier Dune Light" theme by Bram de Haan + * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) + * Original Base16 color scheme by Chris Kempson + * (https://github.com/chriskempson/base16) + */ + +/* Comment */ +.hljs-comment, +.hljs-quote { + color: #575757; +} + +/* Red */ +.hljs-variable, +.hljs-template-variable, +.hljs-attribute, +.hljs-attr, +.hljs-tag, +.hljs-name, +.hljs-regexp, +.hljs-link, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #d70025; +} + +/* Orange */ +.hljs-number, +.hljs-meta, +.hljs-built_in, +.hljs-builtin-name, +.hljs-literal, +.hljs-type, +.hljs-params { + color: #b21e00; +} + +/* Green */ +.hljs-string, +.hljs-symbol, +.hljs-bullet { + color: #008200; +} + +/* Blue */ +.hljs-title, +.hljs-section { + color: #0030f2; +} + +/* Purple */ +.hljs-keyword, +.hljs-selector-tag { + color: #9d00ec; +} + +.hljs { + display: block; + overflow-x: auto; + background: #f6f7f6; + color: #000; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} + +.hljs-addition { + color: #22863a; + background-color: #f0fff4; +} + +.hljs-deletion { + color: #b31d28; + background-color: #ffeef0; +} diff --git a/today/book/highlight.js b/today/book/highlight.js new file mode 100644 index 0000000..18d2434 --- /dev/null +++ b/today/book/highlight.js @@ -0,0 +1,54 @@ +/* + Highlight.js 10.1.1 (93fd0d73) + License: BSD-3-Clause + Copyright (c) 2006-2020, Ivan Sagalaev +*/ +var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset"}function u(e){s+=""}function d(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=l();if(s+=t(r.substring(i,g[0].offset)),i=g[0].offset,g===e){o.reverse().forEach(u);do{d(g.splice(0,1)[0]),g=l()}while(g===e&&g.length&&g[0].offset===i);o.reverse().forEach(c)}else"start"===g[0].event?o.push(g[0].node):o.pop(),d(g.splice(0,1)[0])}return s+t(r.substr(i))}});const s="",o=e=>!!e.kind;class l{constructor(e,n){this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){this.buffer+=t(e)}openNode(e){if(!o(e))return;let n=e.kind;e.sublanguage||(n=`${this.classPrefix}${n}`),this.span(n)}closeNode(e){o(e)&&(this.buffer+=s)}value(){return this.buffer}span(e){this.buffer+=``}}class c{constructor(){this.rootNode={children:[]},this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){this.top.children.push(e)}openNode(e){const n={kind:e,children:[]};this.add(n),this.stack.push(n)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n),n.children.forEach(n=>this._walk(e,n)),e.closeNode(n)),e}static _collapse(e){"string"!=typeof e&&e.children&&(e.children.every(e=>"string"==typeof e)?e.children=[e.children.join("")]:e.children.forEach(e=>{c._collapse(e)}))}}class u extends c{constructor(e){super(),this.options=e}addKeyword(e,n){""!==e&&(this.openNode(n),this.addText(e),this.closeNode())}addText(e){""!==e&&this.add(e)}addSublanguage(e,n){const t=e.root;t.kind=n,t.sublanguage=!0,this.add(t)}toHTML(){return new l(this,this.options).value()}finalize(){return!0}}function d(e){return e?"string"==typeof e?e:e.source:null}const g="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",h={begin:"\\\\[\\s\\S]",relevance:0},f={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[h]},p={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[h]},b={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},m=function(e,n,t={}){var a=r({className:"comment",begin:e,end:n,contains:[]},t);return a.contains.push(b),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):",relevance:0}),a},v=m("//","$"),x=m("/\\*","\\*/"),E=m("#","$");var _=Object.freeze({__proto__:null,IDENT_RE:"[a-zA-Z]\\w*",UNDERSCORE_IDENT_RE:"[a-zA-Z_]\\w*",NUMBER_RE:"\\b\\d+(\\.\\d+)?",C_NUMBER_RE:g,BINARY_NUMBER_RE:"\\b(0b[01]+)",RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(e={})=>{const n=/^#![ ]*\//;return e.binary&&(e.begin=function(...e){return e.map(e=>d(e)).join("")}(n,/.*\b/,e.binary,/\b.*/)),r({className:"meta",begin:n,end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)},BACKSLASH_ESCAPE:h,APOS_STRING_MODE:f,QUOTE_STRING_MODE:p,PHRASAL_WORDS_MODE:b,COMMENT:m,C_LINE_COMMENT_MODE:v,C_BLOCK_COMMENT_MODE:x,HASH_COMMENT_MODE:E,NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?",relevance:0},C_NUMBER_MODE:{className:"number",begin:g,relevance:0},BINARY_NUMBER_MODE:{className:"number",begin:"\\b(0b[01]+)",relevance:0},CSS_NUMBER_MODE:{className:"number",begin:"\\b\\d+(\\.\\d+)?(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[h,{begin:/\[/,end:/\]/,relevance:0,contains:[h]}]}]},TITLE_MODE:{className:"title",begin:"[a-zA-Z]\\w*",relevance:0},UNDERSCORE_TITLE_MODE:{className:"title",begin:"[a-zA-Z_]\\w*",relevance:0},METHOD_GUARD:{begin:"\\.\\s*[a-zA-Z_]\\w*",relevance:0},END_SAME_AS_BEGIN:function(e){return Object.assign(e,{"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{n.data._beginMatch!==e[1]&&n.ignoreMatch()}})}}),N="of and for in not or if then".split(" ");function w(e,n){return n?+n:function(e){return N.includes(e.toLowerCase())}(e)?0:1}const R=t,y=r,{nodeStream:k,mergeStreams:O}=i,M=Symbol("nomatch");return function(t){var a=[],i={},s={},o=[],l=!0,c=/(^(<[^>]+>|\t|)+|\n)/gm,g="Could not find the language '{}', did you forget to load/include a language module?";const h={disableAutodetect:!0,name:"Plain text",contains:[]};var f={noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:null,__emitter:u};function p(e){return f.noHighlightRe.test(e)}function b(e,n,t,r){var a={code:n,language:e};S("before:highlight",a);var i=a.result?a.result:m(a.language,a.code,t,r);return i.code=a.code,S("after:highlight",i),i}function m(e,t,a,s){var o=t;function c(e,n){var t=E.case_insensitive?n[0].toLowerCase():n[0];return Object.prototype.hasOwnProperty.call(e.keywords,t)&&e.keywords[t]}function u(){null!=y.subLanguage?function(){if(""!==A){var e=null;if("string"==typeof y.subLanguage){if(!i[y.subLanguage])return void O.addText(A);e=m(y.subLanguage,A,!0,k[y.subLanguage]),k[y.subLanguage]=e.top}else e=v(A,y.subLanguage.length?y.subLanguage:null);y.relevance>0&&(I+=e.relevance),O.addSublanguage(e.emitter,e.language)}}():function(){if(!y.keywords)return void O.addText(A);let e=0;y.keywordPatternRe.lastIndex=0;let n=y.keywordPatternRe.exec(A),t="";for(;n;){t+=A.substring(e,n.index);const r=c(y,n);if(r){const[e,a]=r;O.addText(t),t="",I+=a,O.addKeyword(n[0],e)}else t+=n[0];e=y.keywordPatternRe.lastIndex,n=y.keywordPatternRe.exec(A)}t+=A.substr(e),O.addText(t)}(),A=""}function h(e){return e.className&&O.openNode(e.className),y=Object.create(e,{parent:{value:y}})}function p(e){return 0===y.matcher.regexIndex?(A+=e[0],1):(L=!0,0)}var b={};function x(t,r){var i=r&&r[0];if(A+=t,null==i)return u(),0;if("begin"===b.type&&"end"===r.type&&b.index===r.index&&""===i){if(A+=o.slice(r.index,r.index+1),!l){const n=Error("0 width match regex");throw n.languageName=e,n.badRule=b.rule,n}return 1}if(b=r,"begin"===r.type)return function(e){var t=e[0],r=e.rule;const a=new n(r),i=[r.__beforeBegin,r["on:begin"]];for(const n of i)if(n&&(n(e,a),a.ignore))return p(t);return r&&r.endSameAsBegin&&(r.endRe=RegExp(t.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")),r.skip?A+=t:(r.excludeBegin&&(A+=t),u(),r.returnBegin||r.excludeBegin||(A=t)),h(r),r.returnBegin?0:t.length}(r);if("illegal"===r.type&&!a){const e=Error('Illegal lexeme "'+i+'" for mode "'+(y.className||"")+'"');throw e.mode=y,e}if("end"===r.type){var s=function(e){var t=e[0],r=o.substr(e.index),a=function e(t,r,a){let i=function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(t.endRe,a);if(i){if(t["on:end"]){const e=new n(t);t["on:end"](r,e),e.ignore&&(i=!1)}if(i){for(;t.endsParent&&t.parent;)t=t.parent;return t}}if(t.endsWithParent)return e(t.parent,r,a)}(y,e,r);if(!a)return M;var i=y;i.skip?A+=t:(i.returnEnd||i.excludeEnd||(A+=t),u(),i.excludeEnd&&(A=t));do{y.className&&O.closeNode(),y.skip||y.subLanguage||(I+=y.relevance),y=y.parent}while(y!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),h(a.starts)),i.returnEnd?0:t.length}(r);if(s!==M)return s}if("illegal"===r.type&&""===i)return 1;if(B>1e5&&B>3*r.index)throw Error("potential infinite loop, way more iterations than matches");return A+=i,i.length}var E=T(e);if(!E)throw console.error(g.replace("{}",e)),Error('Unknown language: "'+e+'"');var _=function(e){function n(n,t){return RegExp(d(n),"m"+(e.case_insensitive?"i":"")+(t?"g":""))}class t{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(e,n){n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]),this.matchAt+=function(e){return RegExp(e.toString()+"|").exec("").length-1}(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);const e=this.regexes.map(e=>e[1]);this.matcherRe=n(function(e,n="|"){for(var t=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,r=0,a="",i=0;i0&&(a+=n),a+="(";o.length>0;){var l=t.exec(o);if(null==l){a+=o;break}a+=o.substring(0,l.index),o=o.substring(l.index+l[0].length),"\\"===l[0][0]&&l[1]?a+="\\"+(+l[1]+s):(a+=l[0],"("===l[0]&&r++)}a+=")"}return a}(e),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex;const n=this.matcherRe.exec(e);if(!n)return null;const t=n.findIndex((e,n)=>n>0&&void 0!==e),r=this.matchIndexes[t];return n.splice(0,t),Object.assign(n,r)}}class a{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t;return this.rules.slice(e).forEach(([e,t])=>n.addRule(e,t)),n.compile(),this.multiRegexes[e]=n,n}considerAll(){this.regexIndex=0}addRule(e,n){this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex;const t=n.exec(e);return t&&(this.regexIndex+=t.position+1,this.regexIndex===this.count&&(this.regexIndex=0)),t}}function i(e,n){const t=e.input[e.index-1],r=e.input[e.index+e[0].length];"."!==t&&"."!==r||n.ignoreMatch()}if(e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return function t(s,o){const l=s;if(s.compiled)return l;s.compiled=!0,s.__beforeBegin=null,s.keywords=s.keywords||s.beginKeywords;let c=null;if("object"==typeof s.keywords&&(c=s.keywords.$pattern,delete s.keywords.$pattern),s.keywords&&(s.keywords=function(e,n){var t={};return"string"==typeof e?r("keyword",e):Object.keys(e).forEach((function(n){r(n,e[n])})),t;function r(e,r){n&&(r=r.toLowerCase()),r.split(" ").forEach((function(n){var r=n.split("|");t[r[0]]=[e,w(r[0],r[1])]}))}}(s.keywords,e.case_insensitive)),s.lexemes&&c)throw Error("ERR: Prefer `keywords.$pattern` to `mode.lexemes`, BOTH are not allowed. (see mode reference) ");return l.keywordPatternRe=n(s.lexemes||c||/\w+/,!0),o&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")(?=\\b|\\s)",s.__beforeBegin=i),s.begin||(s.begin=/\B|\b/),l.beginRe=n(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(l.endRe=n(s.end)),l.terminator_end=d(s.end)||"",s.endsWithParent&&o.terminator_end&&(l.terminator_end+=(s.end?"|":"")+o.terminator_end)),s.illegal&&(l.illegalRe=n(s.illegal)),void 0===s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map((function(n){return r(e,{variants:null},n)}))),e.cached_variants?e.cached_variants:function e(n){return!!n&&(n.endsWithParent||e(n.starts))}(e)?r(e,{starts:e.starts?r(e.starts):null}):Object.isFrozen(e)?r(e):e}("self"===e?s:e)}))),s.contains.forEach((function(e){t(e,l)})),s.starts&&t(s.starts,o),l.matcher=function(e){const n=new a;return e.contains.forEach(e=>n.addRule(e.begin,{rule:e,type:"begin"})),e.terminator_end&&n.addRule(e.terminator_end,{type:"end"}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n}(l),l}(e)}(E),N="",y=s||_,k={},O=new f.__emitter(f);!function(){for(var e=[],n=y;n!==E;n=n.parent)n.className&&e.unshift(n.className);e.forEach(e=>O.openNode(e))}();var A="",I=0,S=0,B=0,L=!1;try{for(y.matcher.considerAll();;){B++,L?L=!1:(y.matcher.lastIndex=S,y.matcher.considerAll());const e=y.matcher.exec(o);if(!e)break;const n=x(o.substring(S,e.index),e);S=e.index+n}return x(o.substr(S)),O.closeAllNodes(),O.finalize(),N=O.toHTML(),{relevance:I,value:N,language:e,illegal:!1,emitter:O,top:y}}catch(n){if(n.message&&n.message.includes("Illegal"))return{illegal:!0,illegalBy:{msg:n.message,context:o.slice(S-100,S+100),mode:n.mode},sofar:N,relevance:0,value:R(o),emitter:O};if(l)return{illegal:!1,relevance:0,value:R(o),emitter:O,language:e,top:y,errorRaised:n};throw n}}function v(e,n){n=n||f.languages||Object.keys(i);var t=function(e){const n={relevance:0,emitter:new f.__emitter(f),value:R(e),illegal:!1,top:h};return n.emitter.addText(e),n}(e),r=t;return n.filter(T).filter(I).forEach((function(n){var a=m(n,e,!1);a.language=n,a.relevance>r.relevance&&(r=a),a.relevance>t.relevance&&(r=t,t=a)})),r.language&&(t.second_best=r),t}function x(e){return f.tabReplace||f.useBR?e.replace(c,e=>"\n"===e?f.useBR?"
":e:f.tabReplace?e.replace(/\t/g,f.tabReplace):e):e}function E(e){let n=null;const t=function(e){var n=e.className+" ";n+=e.parentNode?e.parentNode.className:"";const t=f.languageDetectRe.exec(n);if(t){var r=T(t[1]);return r||(console.warn(g.replace("{}",t[1])),console.warn("Falling back to no-highlight mode for this block.",e)),r?t[1]:"no-highlight"}return n.split(/\s+/).find(e=>p(e)||T(e))}(e);if(p(t))return;S("before:highlightBlock",{block:e,language:t}),f.useBR?(n=document.createElement("div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n"):n=e;const r=n.textContent,a=t?b(t,r,!0):v(r),i=k(n);if(i.length){const e=document.createElement("div");e.innerHTML=a.value,a.value=O(i,k(e),r)}a.value=x(a.value),S("after:highlightBlock",{block:e,result:a}),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),e.includes(r)||a.push(r),a.join(" ").trim()}(e.className,t,a.language),e.result={language:a.language,re:a.relevance,relavance:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance,relavance:a.second_best.relevance})}const N=()=>{if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");a.forEach.call(e,E)}};function T(e){return e=(e||"").toLowerCase(),i[e]||i[s[e]]}function A(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach(e=>{s[e]=n})}function I(e){var n=T(e);return n&&!n.disableAutodetect}function S(e,n){var t=e;o.forEach((function(e){e[t]&&e[t](n)}))}Object.assign(t,{highlight:b,highlightAuto:v,fixMarkup:x,highlightBlock:E,configure:function(e){f=y(f,e)},initHighlighting:N,initHighlightingOnLoad:function(){window.addEventListener("DOMContentLoaded",N,!1)},registerLanguage:function(e,n){var r=null;try{r=n(t)}catch(n){if(console.error("Language definition for '{}' could not be registered.".replace("{}",e)),!l)throw n;console.error(n),r=h}r.name||(r.name=e),i[e]=r,r.rawDefinition=n.bind(null,t),r.aliases&&A(r.aliases,{languageName:e})},listLanguages:function(){return Object.keys(i)},getLanguage:T,registerAliases:A,requireLanguage:function(e){var n=T(e);if(n)return n;throw Error("The '{}' language is required, but not loaded.".replace("{}",e))},autoDetection:I,inherit:y,addPlugin:function(e){o.push(e)}}),t.debugMode=function(){l=!1},t.safeMode=function(){l=!0},t.versionString="10.1.1";for(const n in _)"object"==typeof _[n]&&e(_[n]);return Object.assign(t,_),t}({})}();"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); +hljs.registerLanguage("apache",function(){"use strict";return function(e){var n={className:"number",begin:"\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?"};return{name:"Apache config",aliases:["apacheconf"],case_insensitive:!0,contains:[e.HASH_COMMENT_MODE,{className:"section",begin:"",contains:[n,{className:"number",begin:":\\d{1,5}"},e.inherit(e.QUOTE_STRING_MODE,{relevance:0})]},{className:"attribute",begin:/\w+/,relevance:0,keywords:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{end:/$/,relevance:0,keywords:{literal:"on off all deny allow"},contains:[{className:"meta",begin:"\\s\\[",end:"\\]$"},{className:"variable",begin:"[\\$%]\\{",end:"\\}",contains:["self",{className:"number",begin:"[\\$%]\\d+"}]},n,{className:"number",begin:"\\d+"},e.QUOTE_STRING_MODE]}}],illegal:/\S/}}}()); +hljs.registerLanguage("bash",function(){"use strict";return function(e){const s={};Object.assign(s,{className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{/,end:/\}/,contains:[{begin:/:-/,contains:[s]}]}]});const t={className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,t]};t.contains.push(n);const a={begin:/\$\(\(/,end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,s]},i=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{name:"Bash",aliases:["sh","zsh"],keywords:{$pattern:/\b-?[a-z\._]+\b/,keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[i,e.SHEBANG(),c,a,e.HASH_COMMENT_MODE,n,{className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},s]}}}()); +hljs.registerLanguage("c-like",function(){"use strict";return function(e){function t(e){return"(?:"+e+")?"}var n="(decltype\\(auto\\)|"+t("[a-zA-Z_]\\w*::")+"[a-zA-Z_]\\w*"+t("<.*?>")+")",r={className:"keyword",begin:"\\b[a-z\\d_]*_t\\b"},a={className:"string",variants:[{begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)",end:"'",illegal:"."},e.END_SAME_AS_BEGIN({begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},i={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{"meta-keyword":"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include"},contains:[{begin:/\\\n/,relevance:0},e.inherit(a,{className:"meta-string"}),{className:"meta-string",begin:/<.*?>/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},o={className:"title",begin:t("[a-zA-Z_]\\w*::")+e.IDENT_RE,relevance:0},c=t("[a-zA-Z_]\\w*::")+e.IDENT_RE+"\\s*\\(",l={keyword:"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_t short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq",built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary",literal:"true false nullptr NULL"},d=[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,i,a],_={variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}],keywords:l,contains:d.concat([{begin:/\(/,end:/\)/,keywords:l,contains:d.concat(["self"]),relevance:0}]),relevance:0},u={className:"function",begin:"("+n+"[\\*&\\s]+)+"+c,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:l,illegal:/[^\w\s\*&:<>]/,contains:[{begin:"decltype\\(auto\\)",keywords:l,relevance:0},{begin:c,returnBegin:!0,contains:[o],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r,{begin:/\(/,end:/\)/,keywords:l,relevance:0,contains:["self",e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,i,r]}]},r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s]};return{aliases:["c","cc","h","c++","h++","hpp","hh","hxx","cxx"],keywords:l,disableAutodetect:!0,illegal:"",keywords:l,contains:["self",r]},{begin:e.IDENT_RE+"::",keywords:l},{className:"class",beginKeywords:"class struct",end:/[{;:]/,contains:[{begin://,contains:["self"]},e.TITLE_MODE]}]),exports:{preprocessor:s,strings:a,keywords:l}}}}()); +hljs.registerLanguage("c",function(){"use strict";return function(e){var n=e.getLanguage("c-like").rawDefinition();return n.name="C",n.aliases=["c","h"],n}}()); +hljs.registerLanguage("coffeescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={keyword:e.concat(["then","unless","until","loop","by","when","and","or","is","isnt","not"]).filter((e=>n=>!e.includes(n))(["var","const","let","function","static"])).join(" "),literal:n.concat(["yes","no","on","off"]).join(" "),built_in:a.concat(["npm","print"]).join(" ")},i="[A-Za-z$_][0-9A-Za-z$_]*",s={className:"subst",begin:/#\{/,end:/}/,keywords:t},o=[r.BINARY_NUMBER_MODE,r.inherit(r.C_NUMBER_MODE,{starts:{end:"(\\s*/)?",relevance:0}}),{className:"string",variants:[{begin:/'''/,end:/'''/,contains:[r.BACKSLASH_ESCAPE]},{begin:/'/,end:/'/,contains:[r.BACKSLASH_ESCAPE]},{begin:/"""/,end:/"""/,contains:[r.BACKSLASH_ESCAPE,s]},{begin:/"/,end:/"/,contains:[r.BACKSLASH_ESCAPE,s]}]},{className:"regexp",variants:[{begin:"///",end:"///",contains:[s,r.HASH_COMMENT_MODE]},{begin:"//[gim]{0,3}(?=\\W)",relevance:0},{begin:/\/(?![ *]).*?(?![\\]).\/[gim]{0,3}(?=\W)/}]},{begin:"@"+i},{subLanguage:"javascript",excludeBegin:!0,excludeEnd:!0,variants:[{begin:"```",end:"```"},{begin:"`",end:"`"}]}];s.contains=o;var c=r.inherit(r.TITLE_MODE,{begin:i}),l={className:"params",begin:"\\([^\\(]",returnBegin:!0,contains:[{begin:/\(/,end:/\)/,keywords:t,contains:["self"].concat(o)}]};return{name:"CoffeeScript",aliases:["coffee","cson","iced"],keywords:t,illegal:/\/\*/,contains:o.concat([r.COMMENT("###","###"),r.HASH_COMMENT_MODE,{className:"function",begin:"^\\s*"+i+"\\s*=\\s*(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[c,l]},{begin:/[:\(,=]\s*/,relevance:0,contains:[{className:"function",begin:"(\\(.*\\))?\\s*\\B[-=]>",end:"[-=]>",returnBegin:!0,contains:[l]}]},{className:"class",beginKeywords:"class",end:"$",illegal:/[:="\[\]]/,contains:[{beginKeywords:"extends",endsWithParent:!0,illegal:/[:="\[\]]/,contains:[c]},c]},{begin:i+":",end:":",returnBegin:!0,returnEnd:!0,relevance:0}])}}}()); +hljs.registerLanguage("cpp",function(){"use strict";return function(e){var t=e.getLanguage("c-like").rawDefinition();return t.disableAutodetect=!1,t.name="C++",t.aliases=["cc","c++","h++","hpp","hh","hxx","cxx"],t}}()); +hljs.registerLanguage("csharp",function(){"use strict";return function(e){var n={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield",literal:"null false true"},i=e.inherit(e.TITLE_MODE,{begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{begin:"\\b(0b[01']+)"},{begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],relevance:0},s={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}]},t=e.inherit(s,{illegal:/\n/}),l={className:"subst",begin:"{",end:"}",keywords:n},r=e.inherit(l,{illegal:/\n/}),c={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},e.BACKSLASH_ESCAPE,r]},o={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},l]},g=e.inherit(o,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},r]});l.contains=[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE],r.contains=[g,c,t,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];var d={variants:[o,c,s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},E={begin:"<",end:">",contains:[{beginKeywords:"in out"},i]},_=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",b={begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"],keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0,contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{begin:"\x3c!--|--\x3e"},{begin:""}]}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#",end:"$",keywords:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},d,a,{beginKeywords:"class interface",end:/[{;=]/,illegal:/[^\s:,]/,contains:[{beginKeywords:"where class"},i,E,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace",end:/[{;=]/,illegal:/[^\s:]/,contains:[i,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta",begin:"^\\s*\\[",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{className:"meta-string",begin:/"/,end:/"/}]},{beginKeywords:"new return throw await else",relevance:0},{className:"function",begin:"("+_+"\\s+)+"+e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{begin:e.IDENT_RE+"\\s*(\\<.+\\>)?\\s*\\(",returnBegin:!0,contains:[e.TITLE_MODE,E],relevance:0},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0,contains:[d,a,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},b]}}}()); +hljs.registerLanguage("css",function(){"use strict";return function(e){var n={begin:/(?:[A-Z\_\.\-]+|--[a-zA-Z0-9_-]+)\s*:/,returnBegin:!0,end:";",endsWithParent:!0,contains:[{className:"attribute",begin:/\S/,end:":",excludeEnd:!0,starts:{endsWithParent:!0,excludeEnd:!0,contains:[{begin:/[\w-]+\(/,returnBegin:!0,contains:[{className:"built_in",begin:/[\w-]+/},{begin:/\(/,end:/\)/,contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{className:"number",begin:"#[0-9A-Fa-f]+"},{className:"meta",begin:"!important"}]}}]};return{name:"CSS",case_insensitive:!0,illegal:/[=\/|'\$]/,contains:[e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/},{className:"selector-class",begin:/\.[A-Za-z0-9_-]+/},{className:"selector-attr",begin:/\[/,end:/\]/,illegal:"$",contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",illegal:/:/,returnBegin:!0,contains:[{className:"keyword",begin:/@\-?\w[\w]*(\-\w+)*/},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:"and or not only",contains:[{begin:/[a-z-]+:/,className:"attribute"},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.CSS_NUMBER_MODE]}]},{className:"selector-tag",begin:"[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0},{begin:"{",end:"}",illegal:/\S/,contains:[e.C_BLOCK_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("diff",function(){"use strict";return function(e){return{name:"Diff",aliases:["patch"],contains:[{className:"meta",relevance:10,variants:[{begin:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{begin:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{begin:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{className:"comment",variants:[{begin:/Index: /,end:/$/},{begin:/={3,}/,end:/$/},{begin:/^\-{3}/,end:/$/},{begin:/^\*{3} /,end:/$/},{begin:/^\+{3}/,end:/$/},{begin:/^\*{15}$/}]},{className:"addition",begin:"^\\+",end:"$"},{className:"deletion",begin:"^\\-",end:"$"},{className:"addition",begin:"^\\!",end:"$"}]}}}()); +hljs.registerLanguage("go",function(){"use strict";return function(e){var n={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{name:"Go",aliases:["golang"],keywords:n,illegal:"e(n)).join("")}return function(a){var s={className:"number",relevance:0,variants:[{begin:/([\+\-]+)?[\d]+_[\d_]+/},{begin:a.NUMBER_RE}]},i=a.COMMENT();i.variants=[{begin:/;/,end:/$/},{begin:/#/,end:/$/}];var t={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},r={className:"literal",begin:/\bon|off|true|false|yes|no\b/},l={className:"string",contains:[a.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}]},c={begin:/\[/,end:/\]/,contains:[i,r,t,l,s,"self"],relevance:0},g="("+[/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/].map(n=>e(n)).join("|")+")";return{name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/,contains:[i,{className:"section",begin:/\[+/,end:/\]+/},{begin:n(g,"(\\s*\\.\\s*",g,")*",n("(?=",/\s*=\s*[^#\s]/,")")),className:"attr",starts:{end:/$/,contains:[i,c,r,t,l,s]}}]}}}()); +hljs.registerLanguage("java",function(){"use strict";function e(e){return e?"string"==typeof e?e:e.source:null}function n(e){return a("(",e,")?")}function a(...n){return n.map(n=>e(n)).join("")}function s(...n){return"("+n.map(n=>e(n)).join("|")+")"}return function(e){var t="false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",i={className:"meta",begin:"@[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*",contains:[{begin:/\(/,end:/\)/,contains:["self"]}]},r=e=>a("[",e,"]+([",e,"_]*[",e,"]+)?"),c={className:"number",variants:[{begin:`\\b(0[bB]${r("01")})[lL]?`},{begin:`\\b(0${r("0-7")})[dDfFlL]?`},{begin:a(/\b0[xX]/,s(a(r("a-fA-F0-9"),/\./,r("a-fA-F0-9")),a(r("a-fA-F0-9"),/\.?/),a(/\./,r("a-fA-F0-9"))),/([pP][+-]?(\d+))?/,/[fFdDlL]?/)},{begin:a(/\b/,s(a(/\d*\./,r("\\d")),r("\\d")),/[eE][+-]?[\d]+[dDfF]?/)},{begin:a(/\b/,r(/\d/),n(/\.?/),n(r(/\d/)),/[dDfFlL]?/)}],relevance:0};return{name:"Java",aliases:["jsp"],keywords:t,illegal:/<\/|#/,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/,relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"class",beginKeywords:"class interface",end:/[{;=]/,excludeEnd:!0,keywords:"class interface",illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"new throw return else",relevance:0},{className:"function",begin:"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\s*,\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\s+)+"+e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:t,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"params",begin:/\(/,end:/\)/,keywords:t,relevance:0,contains:[i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE]},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},c,i]}}}()); +hljs.registerLanguage("javascript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);function s(e){return r("(?=",e,")")}function r(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(t){var i="[A-Za-z$_][0-9A-Za-z$_]*",c={begin:/<[A-Za-z0-9\\._:-]+/,end:/\/[A-Za-z0-9\\._:-]+>|\/>/},o={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.join(" "),literal:n.join(" "),built_in:a.join(" ")},l={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:t.C_NUMBER_RE+"n?"}],relevance:0},E={className:"subst",begin:"\\$\\{",end:"\\}",keywords:o,contains:[]},d={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[t.BACKSLASH_ESCAPE,E],subLanguage:"css"}},u={className:"string",begin:"`",end:"`",contains:[t.BACKSLASH_ESCAPE,E]};E.contains=[t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,l,t.REGEXP_MODE];var b=E.contains.concat([{begin:/\(/,end:/\)/,contains:["self"].concat(E.contains,[t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE])},t.C_BLOCK_COMMENT_MODE,t.C_LINE_COMMENT_MODE]),_={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:b};return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:o,contains:[t.SHEBANG({binary:"node",relevance:5}),{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},t.APOS_STRING_MODE,t.QUOTE_STRING_MODE,d,g,u,t.C_LINE_COMMENT_MODE,t.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+",contains:[{className:"type",begin:"\\{",end:"\\}",relevance:0},{className:"variable",begin:i+"(?=\\s*(-)|$)",endsParent:!0,relevance:0},{begin:/(?=[^\n])\s/,relevance:0}]}]}),t.C_BLOCK_COMMENT_MODE,l,{begin:r(/[{,\n]\s*/,s(r(/(((\/\/.*)|(\/\*(.|\n)*\*\/))\s*)*/,i+"\\s*:"))),relevance:0,contains:[{className:"attr",begin:i+s("\\s*:"),relevance:0}]},{begin:"("+t.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[t.C_LINE_COMMENT_MODE,t.C_BLOCK_COMMENT_MODE,t.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+t.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:o,contains:b}]}]},{begin:/,/,relevance:0},{className:"",begin:/\s/,end:/\s*/,skip:!0},{variants:[{begin:"<>",end:""},{begin:c.begin,end:c.end}],subLanguage:"xml",contains:[{begin:c.begin,end:c.end,skip:!0,contains:["self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[t.inherit(t.TITLE_MODE,{begin:i}),_],illegal:/\[|%/},{begin:/\$[(.]/},t.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},t.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0},{begin:"(get|set)\\s+(?="+i+"\\()",end:/{/,keywords:"get set",contains:[t.inherit(t.TITLE_MODE,{begin:i}),{begin:/\(\)/},_]}],illegal:/#(?!!)/}}}()); +hljs.registerLanguage("json",function(){"use strict";return function(n){var e={literal:"true false null"},i=[n.C_LINE_COMMENT_MODE,n.C_BLOCK_COMMENT_MODE],t=[n.QUOTE_STRING_MODE,n.C_NUMBER_MODE],a={end:",",endsWithParent:!0,excludeEnd:!0,contains:t,keywords:e},l={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[n.BACKSLASH_ESCAPE],illegal:"\\n"},n.inherit(a,{begin:/:/})].concat(i),illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[n.inherit(a)],illegal:"\\S"};return t.push(l,s),i.forEach((function(n){t.push(n)})),{name:"JSON",contains:t,keywords:e,illegal:"\\S"}}}()); +hljs.registerLanguage("kotlin",function(){"use strict";return function(e){var n={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},a={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@"},i={className:"subst",begin:"\\${",end:"}",contains:[e.C_NUMBER_MODE]},s={className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},t={className:"string",variants:[{begin:'"""',end:'"""(?=[^"])',contains:[s,i]},{begin:"'",end:"'",illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,s,i]}]};i.contains.push(t);var r={className:"meta",begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?"},l={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/,end:/\)/,contains:[e.inherit(t,{className:"meta-string"})]}]},c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),o={variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]},d=o;return d.variants[1].contains=[o],o.variants[1].contains=[d],{name:"Kotlin",aliases:["kt"],keywords:n,contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},a,r,l,{className:"function",beginKeywords:"fun",end:"[(]|$",returnBegin:!0,excludeEnd:!0,keywords:n,illegal:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,relevance:5,contains:[{begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0,contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://,keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/,endsWithParent:!0,contains:[o,e.C_LINE_COMMENT_MODE,c],relevance:0},e.C_LINE_COMMENT_MODE,c,r,l,t,e.C_NUMBER_MODE]},c]},{className:"class",beginKeywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0,illegal:"extends implements",contains:[{beginKeywords:"public protected internal private constructor"},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,]|$/,excludeBegin:!0,returnEnd:!0},r,l]},t,{className:"meta",begin:"^#!/usr/bin/env",end:"$",illegal:"\n"},{className:"number",begin:"\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",relevance:0}]}}}()); +hljs.registerLanguage("less",function(){"use strict";return function(e){var n="([\\w-]+|@{[\\w-]+})",a=[],s=[],t=function(e){return{className:"string",begin:"~?"+e+".*?"+e}},r=function(e,n,a){return{className:e,begin:n,relevance:a}},i={begin:"\\(",end:"\\)",contains:s,relevance:0};s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t("'"),t('"'),e.CSS_NUMBER_MODE,{begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]",excludeEnd:!0}},r("number","#[0-9A-Fa-f]+\\b"),i,r("variable","@@?[\\w-]+",10),r("variable","@{[\\w-]+}"),r("built_in","~?`[^`]*?`"),{className:"attribute",begin:"[\\w-]+\\s*:",end:":",returnBegin:!0,excludeEnd:!0},{className:"meta",begin:"!important"});var c=s.concat({begin:"{",end:"}",contains:a}),l={beginKeywords:"when",endsWithParent:!0,contains:[{beginKeywords:"and not"}].concat(s)},o={begin:n+"\\s*:",returnBegin:!0,end:"[;}]",relevance:0,contains:[{className:"attribute",begin:n,end:":",excludeEnd:!0,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}]},g={className:"keyword",begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{end:"[;{}]",returnEnd:!0,contains:s,relevance:0}},d={className:"variable",variants:[{begin:"@[\\w-]+\\s*:",relevance:15},{begin:"@[\\w-]+"}],starts:{end:"[;}]",returnEnd:!0,contains:c}},b={variants:[{begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:n,end:"{"}],returnBegin:!0,returnEnd:!0,illegal:"[<='$\"]",relevance:0,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,l,r("keyword","all\\b"),r("variable","@{[\\w-]+}"),r("selector-tag",n+"%?",0),r("selector-id","#"+n),r("selector-class","\\."+n,0),r("selector-tag","&",0),{className:"selector-attr",begin:"\\[",end:"\\]"},{className:"selector-pseudo",begin:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{begin:"\\(",end:"\\)",contains:c},{begin:"!important"}]};return a.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,g,d,o,b),{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:a}}}()); +hljs.registerLanguage("lua",function(){"use strict";return function(e){var t={begin:"\\[=*\\[",end:"\\]=*\\]",contains:["self"]},a=[e.COMMENT("--(?!\\[=*\\[)","$"),e.COMMENT("--\\[=*\\[","\\]=*\\]",{contains:[t],relevance:10})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE,literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},contains:a.concat([{className:"function",beginKeywords:"function",end:"\\)",contains:[e.inherit(e.TITLE_MODE,{begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params",begin:"\\(",endsWithParent:!0,contains:a}].concat(a)},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string",begin:"\\[=*\\[",end:"\\]=*\\]",contains:[t],relevance:5}])}}}()); +hljs.registerLanguage("makefile",function(){"use strict";return function(e){var i={className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)",contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%`]+/}]}]}]};return{name:"HTML, XML",aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],case_insensitive:!0,contains:[{className:"meta",begin:"",relevance:10,contains:[a,i,t,s,{begin:"\\[",end:"\\]",contains:[{className:"meta",begin:"",contains:[a,s,i,t]}]}]},e.COMMENT("\x3c!--","--\x3e",{relevance:10}),{begin:"<\\!\\[CDATA\\[",end:"\\]\\]>",relevance:10},n,{className:"meta",begin:/<\?xml/,end:/\?>/,relevance:10},{className:"tag",begin:")",end:">",keywords:{name:"style"},contains:[c],starts:{end:"",returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag",begin:")",end:">",keywords:{name:"script"},contains:[c],starts:{end:"<\/script>",returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{className:"tag",begin:"",contains:[{className:"name",begin:/[^\/><\s]+/,relevance:0},c]}]}}}()); +hljs.registerLanguage("markdown",function(){"use strict";return function(n){const e={begin:"<",end:">",subLanguage:"xml",relevance:0},a={begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},i={className:"strong",contains:[],variants:[{begin:/_{2}/,end:/_{2}/},{begin:/\*{2}/,end:/\*{2}/}]},s={className:"emphasis",contains:[],variants:[{begin:/\*(?!\*)/,end:/\*/},{begin:/_(?!_)/,end:/_/,relevance:0}]};i.contains.push(s),s.contains.push(i);var c=[e,a];return i.contains=i.contains.concat(c),s.contains=s.contains.concat(c),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:c=c.concat(i,s)},{begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n",contains:c}]}]},e,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)",end:"\\s+",excludeEnd:!0},i,s,{className:"quote",begin:"^>\\s+",contains:c,end:"$"},{className:"code",variants:[{begin:"(`{3,})(.|\\n)*?\\1`*[ ]*"},{begin:"(~{3,})(.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))",contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},a,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}}()); +hljs.registerLanguage("nginx",function(){"use strict";return function(e){var n={className:"variable",variants:[{begin:/\$\d+/},{begin:/\$\{/,end:/}/},{begin:"[\\$\\@]"+e.UNDERSCORE_IDENT_RE}]},a={endsWithParent:!0,keywords:{$pattern:"[a-z/_]+",literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},relevance:0,illegal:"=>",contains:[e.HASH_COMMENT_MODE,{className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:/"/,end:/"/},{begin:/'/,end:/'/}]},{begin:"([a-z]+):/",end:"\\s",endsWithParent:!0,excludeEnd:!0,contains:[n]},{className:"regexp",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:"\\s\\^",end:"\\s|{|;",returnEnd:!0},{begin:"~\\*?\\s+",end:"\\s|{|;",returnEnd:!0},{begin:"\\*(\\.[a-z\\-]+)+"},{begin:"([a-z\\-]+\\.)+\\*"}]},{className:"number",begin:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{className:"number",begin:"\\b\\d+[kKmMgGdshdwy]*\\b",relevance:0},n]};return{name:"Nginx config",aliases:["nginxconf"],contains:[e.HASH_COMMENT_MODE,{begin:e.UNDERSCORE_IDENT_RE+"\\s+{",returnBegin:!0,end:"{",contains:[{className:"section",begin:e.UNDERSCORE_IDENT_RE}],relevance:0},{begin:e.UNDERSCORE_IDENT_RE+"\\s",end:";|{",returnBegin:!0,contains:[{className:"attribute",begin:e.UNDERSCORE_IDENT_RE,starts:a}],relevance:0}],illegal:"[^\\s\\}]"}}}()); +hljs.registerLanguage("objectivec",function(){"use strict";return function(e){var n=/[a-zA-Z@][a-zA-Z0-9_]*/,_={$pattern:n,keyword:"@interface @class @protocol @implementation"};return{name:"Objective-C",aliases:["mm","objc","obj-c"],keywords:{$pattern:n,keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},illegal:"/,end:/$/,illegal:"\\n"},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class",begin:"("+_.keyword.split(" ").join("|")+")\\b",end:"({|$)",excludeEnd:!0,keywords:_,contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE,relevance:0}]}}}()); +hljs.registerLanguage("perl",function(){"use strict";return function(e){var n={$pattern:/[\w.]+/,keyword:"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qq fileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmget sub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedir ioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when"},t={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:n},s={begin:"->{",end:"}"},r={variants:[{begin:/\$\d/},{begin:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{begin:/[\$%@][^\s\w{]/,relevance:0}]},i=[e.BACKSLASH_ESCAPE,t,r],a=[r,e.HASH_COMMENT_MODE,e.COMMENT("^\\=\\w","\\=cut",{endsWithParent:!0}),s,{className:"string",contains:i,variants:[{begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[",end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*\\<",end:"\\>",relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'",contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE]},{begin:"{\\w+}",contains:[],relevance:0},{begin:"-?\\w+\\s*\\=\\>",contains:[],relevance:0}]},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*",keywords:"split return print reverse grep",relevance:0,contains:[e.HASH_COMMENT_MODE,{className:"regexp",begin:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",relevance:10},{className:"regexp",begin:"(m|qr)?/",end:"/[a-z]*",contains:[e.BACKSLASH_ESCAPE],relevance:0}]},{className:"function",beginKeywords:"sub",end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$",subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}]}];return t.contains=a,s.contains=a,{name:"Perl",aliases:["pl","pm"],keywords:n,contains:a}}}()); +hljs.registerLanguage("php",function(){"use strict";return function(e){var r={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},t={className:"meta",variants:[{begin:/<\?php/,relevance:10},{begin:/<\?[=]?/},{begin:/\?>/}]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},n={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]},i={keyword:"__CLASS__ __DIR__ __FILE__ __FUNCTION__ __LINE__ __METHOD__ __NAMESPACE__ __TRAIT__ die echo exit include include_once print require require_once array abstract and as binary bool boolean break callable case catch class clone const continue declare default do double else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval extends final finally float for foreach from global goto if implements instanceof insteadof int integer interface isset iterable list new object or private protected public real return string switch throw trait try unset use var void while xor yield",literal:"false null true",built_in:"Error|0 AppendIterator ArgumentCountError ArithmeticError ArrayIterator ArrayObject AssertionError BadFunctionCallException BadMethodCallException CachingIterator CallbackFilterIterator CompileError Countable DirectoryIterator DivisionByZeroError DomainException EmptyIterator ErrorException Exception FilesystemIterator FilterIterator GlobIterator InfiniteIterator InvalidArgumentException IteratorIterator LengthException LimitIterator LogicException MultipleIterator NoRewindIterator OutOfBoundsException OutOfRangeException OuterIterator OverflowException ParentIterator ParseError RangeException RecursiveArrayIterator RecursiveCachingIterator RecursiveCallbackFilterIterator RecursiveDirectoryIterator RecursiveFilterIterator RecursiveIterator RecursiveIteratorIterator RecursiveRegexIterator RecursiveTreeIterator RegexIterator RuntimeException SeekableIterator SplDoublyLinkedList SplFileInfo SplFileObject SplFixedArray SplHeap SplMaxHeap SplMinHeap SplObjectStorage SplObserver SplObserver SplPriorityQueue SplQueue SplStack SplSubject SplSubject SplTempFileObject TypeError UnderflowException UnexpectedValueException ArrayAccess Closure Generator Iterator IteratorAggregate Serializable Throwable Traversable WeakReference Directory __PHP_Incomplete_Class parent php_user_filter self static stdClass"};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:i,contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[t]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler"}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},t,{className:"keyword",begin:/\$this\b/},r,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"fn function",end:/[;{]/,excludeEnd:!0,illegal:"[$%\\[]",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:i,contains:["self",r,e.C_BLOCK_COMMENT_MODE,a,n]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},a,n]}}}()); +hljs.registerLanguage("php-template",function(){"use strict";return function(n){return{name:"PHP template",subLanguage:"xml",contains:[{begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*",end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0},n.inherit(n.APOS_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0}),n.inherit(n.QUOTE_STRING_MODE,{illegal:null,className:null,contains:null,skip:!0})]}]}}}()); +hljs.registerLanguage("plaintext",function(){"use strict";return function(t){return{name:"Plain text",aliases:["text","txt"],disableAutodetect:!0}}}()); +hljs.registerLanguage("properties",function(){"use strict";return function(e){var n="[ \\t\\f]*",t="("+n+"[:=]"+n+"|[ \\t\\f]+)",a="([^\\\\:= \\t\\f\\n]|\\\\.)+",s={end:t,relevance:0,starts:{className:"string",end:/$/,relevance:0,contains:[{begin:"\\\\\\n"}]}};return{name:".properties",case_insensitive:!0,illegal:/\S/,contains:[e.COMMENT("^\\s*[!#]","$"),{begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+"+t,returnBegin:!0,contains:[{className:"attr",begin:"([^\\\\\\W:= \\t\\f\\n]|\\\\.)+",endsParent:!0,relevance:0}],starts:s},{begin:a+t,returnBegin:!0,relevance:0,contains:[{className:"meta",begin:a,endsParent:!0,relevance:0}],starts:s},{className:"attr",relevance:0,begin:a+n+"$"}]}}}()); +hljs.registerLanguage("python",function(){"use strict";return function(e){var n={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10",built_in:"Ellipsis NotImplemented",literal:"False None True"},a={className:"meta",begin:/^(>>>|\.\.\.) /},i={className:"subst",begin:/\{/,end:/\}/,keywords:n,illegal:/#/},s={begin:/\{\{/,relevance:0},r={className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:/(u|b)?r?'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(u|b)?r?"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a],relevance:10},{begin:/(fr|rf|f)'''/,end:/'''/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(fr|rf|f)"""/,end:/"""/,contains:[e.BACKSLASH_ESCAPE,a,s,i]},{begin:/(u|r|ur)'/,end:/'/,relevance:10},{begin:/(u|r|ur)"/,end:/"/,relevance:10},{begin:/(b|br)'/,end:/'/},{begin:/(b|br)"/,end:/"/},{begin:/(fr|rf|f)'/,end:/'/,contains:[e.BACKSLASH_ESCAPE,s,i]},{begin:/(fr|rf|f)"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,s,i]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},l={className:"number",relevance:0,variants:[{begin:e.BINARY_NUMBER_RE+"[lLjJ]?"},{begin:"\\b(0o[0-7]+)[lLjJ]?"},{begin:e.C_NUMBER_RE+"[lLjJ]?"}]},t={className:"params",variants:[{begin:/\(\s*\)/,skip:!0,className:null},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:["self",a,l,r,e.HASH_COMMENT_MODE]}]};return i.contains=[r,l,a],{name:"Python",aliases:["py","gyp","ipython"],keywords:n,illegal:/(<\/|->|\?)|=>/,contains:[a,l,{beginKeywords:"if",relevance:0},r,e.HASH_COMMENT_MODE,{variants:[{className:"function",beginKeywords:"def"},{className:"class",beginKeywords:"class"}],end:/:/,illegal:/[${=;\n,]/,contains:[e.UNDERSCORE_TITLE_MODE,t,{begin:/->/,endsWithParent:!0,keywords:"None"}]},{className:"meta",begin:/^[\t ]*@/,end:/$/},{begin:/\b(print|exec)\(/}]}}}()); +hljs.registerLanguage("python-repl",function(){"use strict";return function(n){return{aliases:["pycon"],contains:[{className:"meta",starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}}}()); +hljs.registerLanguage("ruby",function(){"use strict";return function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",a={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},s={className:"doctag",begin:"@[A-Za-z]+"},i={begin:"#<",end:">"},r=[e.COMMENT("#","$",{contains:[s]}),e.COMMENT("^\\=begin","^\\=end",{contains:[s],relevance:10}),e.COMMENT("^__END__","\\n$")],c={className:"subst",begin:"#\\{",end:"}",keywords:a},t={className:"string",contains:[e.BACKSLASH_ESCAPE,c],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<[-~]?'?(\w+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/,contains:[e.BACKSLASH_ESCAPE,c]})]}]},b={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:a},d=[t,i,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(r)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),b].concat(r)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[t,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:a},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[i,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(r),relevance:0}].concat(r);c.contains=d,b.contains=d;var g=[{begin:/^\s*=>/,starts:{end:"$",contains:d}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:d}}];return{name:"Ruby",aliases:["rb","gemspec","podspec","thor","irb"],keywords:a,illegal:/\/\*/,contains:r.concat(g).concat(d)}}}()); +hljs.registerLanguage("rust",function(){"use strict";return function(e){var n="([ui](8|16|32|64|128|size)|f(32|64))?",t="drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!";return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",keyword:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",literal:"true false Some None Ok Err",built_in:t},illegal:""}]}}}()); +hljs.registerLanguage("scss",function(){"use strict";return function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},i={className:"number",begin:"#[0-9A-Fa-f]+"};return e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE,{name:"SCSS",case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{className:"selector-pseudo",begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{className:"selector-pseudo",begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,i,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@(page|font-face)",lexemes:"@[a-z-]+",keywords:"@page @font-face"},{begin:"@",end:"[{;]",returnBegin:!0,keywords:"and or not only",contains:[{begin:"@[a-z-]+",className:"keyword"},t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,i,e.CSS_NUMBER_MODE]}]}}}()); +hljs.registerLanguage("shell",function(){"use strict";return function(s){return{name:"Shell Session",aliases:["console"],contains:[{className:"meta",begin:"^\\s{0,3}[/\\w\\d\\[\\]()@-]*[>%$#]",starts:{end:"$",subLanguage:"bash"}}]}}}()); +hljs.registerLanguage("sql",function(){"use strict";return function(e){var t=e.COMMENT("--","$");return{name:"SQL",case_insensitive:!0,illegal:/[<>{}*]/,contains:[{beginKeywords:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with",end:/;/,endsWithParent:!0,keywords:{$pattern:/[\w\.]+/,keyword:"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null unknown",built_in:"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void"},contains:[{className:"string",begin:"'",end:"'",contains:[{begin:"''"}]},{className:"string",begin:'"',end:'"',contains:[{begin:'""'}]},{className:"string",begin:"`",end:"`"},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]},e.C_BLOCK_COMMENT_MODE,t,e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("swift",function(){"use strict";return function(e){var i={keyword:"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c compactMap contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},n=e.COMMENT("/\\*","\\*/",{contains:["self"]}),t={className:"subst",begin:/\\\(/,end:"\\)",keywords:i,contains:[]},a={className:"string",contains:[e.BACKSLASH_ESCAPE,t],variants:[{begin:/"""/,end:/"""/},{begin:/"/,end:/"/}]},r={className:"number",begin:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",relevance:0};return t.contains=[r],{name:"Swift",keywords:i,contains:[a,e.C_LINE_COMMENT_MODE,n,{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*[!?]"},{className:"type",begin:"\\b[A-Z][\\wÀ-ʸ']*",relevance:0},r,{className:"function",beginKeywords:"func",end:"{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][0-9A-Za-z$_]*/}),{begin://},{className:"params",begin:/\(/,end:/\)/,endsParent:!0,keywords:i,contains:["self",r,a,e.C_BLOCK_COMMENT_MODE,{begin:":"}],illegal:/["']/}],illegal:/\[|%/},{className:"class",beginKeywords:"struct protocol class extension enum",keywords:i,end:"\\{",excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{className:"meta",begin:"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\\b"},{beginKeywords:"import",end:/$/,contains:[e.C_LINE_COMMENT_MODE,n]}]}}}()); +hljs.registerLanguage("typescript",function(){"use strict";const e=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],n=["true","false","null","undefined","NaN","Infinity"],a=[].concat(["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],["arguments","this","super","console","window","document","localStorage","module","global"],["Intl","DataView","Number","Math","Date","String","RegExp","Object","Function","Boolean","Error","Symbol","Set","Map","WeakSet","WeakMap","Proxy","Reflect","JSON","Promise","Float64Array","Int16Array","Int32Array","Int8Array","Uint16Array","Uint32Array","Float32Array","Array","Uint8Array","Uint8ClampedArray","ArrayBuffer"],["EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"]);return function(r){var t={$pattern:"[A-Za-z$_][0-9A-Za-z$_]*",keyword:e.concat(["type","namespace","typedef","interface","public","private","protected","implements","declare","abstract","readonly"]).join(" "),literal:n.join(" "),built_in:a.concat(["any","void","number","boolean","string","object","never","enum"]).join(" ")},s={className:"meta",begin:"@[A-Za-z$_][0-9A-Za-z$_]*"},i={className:"number",variants:[{begin:"\\b(0[bB][01]+)n?"},{begin:"\\b(0[oO][0-7]+)n?"},{begin:r.C_NUMBER_RE+"n?"}],relevance:0},o={className:"subst",begin:"\\$\\{",end:"\\}",keywords:t,contains:[]},c={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"xml"}},l={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[r.BACKSLASH_ESCAPE,o],subLanguage:"css"}},E={className:"string",begin:"`",end:"`",contains:[r.BACKSLASH_ESCAPE,o]};o.contains=[r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,i,r.REGEXP_MODE];var d={begin:"\\(",end:/\)/,keywords:t,contains:["self",r.QUOTE_STRING_MODE,r.APOS_STRING_MODE,r.NUMBER_MODE]},u={className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,s,d]};return{name:"TypeScript",aliases:["ts"],keywords:t,contains:[r.SHEBANG(),{className:"meta",begin:/^\s*['"]use strict['"]/},r.APOS_STRING_MODE,r.QUOTE_STRING_MODE,c,l,E,r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,i,{begin:"("+r.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[r.C_LINE_COMMENT_MODE,r.C_BLOCK_COMMENT_MODE,r.REGEXP_MODE,{className:"function",begin:"(\\([^(]*(\\([^(]*(\\([^(]*\\))?\\))?\\)|"+r.UNDERSCORE_IDENT_RE+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:r.UNDERSCORE_IDENT_RE},{className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:t,contains:d.contains}]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/[\{;]/,excludeEnd:!0,keywords:t,contains:["self",r.inherit(r.TITLE_MODE,{begin:"[A-Za-z$_][0-9A-Za-z$_]*"}),u],illegal:/%/,relevance:0},{beginKeywords:"constructor",end:/[\{;]/,excludeEnd:!0,contains:["self",u]},{begin:/module\./,keywords:{built_in:"module"},relevance:0},{beginKeywords:"module",end:/\{/,excludeEnd:!0},{beginKeywords:"interface",end:/\{/,excludeEnd:!0,keywords:"interface extends"},{begin:/\$[(.]/},{begin:"\\."+r.IDENT_RE,relevance:0},s,d]}}}()); +hljs.registerLanguage("yaml",function(){"use strict";return function(e){var n="true false yes no null",a="[\\w#;/?:@&=+$,.~*\\'()[\\]]+",s={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]},i=e.inherit(s,{variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),l={end:",",endsWithParent:!0,excludeEnd:!0,contains:[],keywords:n,relevance:0},t={begin:"{",end:"}",contains:[l],illegal:"\\n",relevance:0},g={begin:"\\[",end:"\\]",contains:[l],illegal:"\\n",relevance:0},b=[{className:"attr",variants:[{begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>]([0-9]?[+-])?[ ]*\\n( *)[\\S ]+\\n(\\2[\\S ]+\\n?)*"},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!\\w+!"+a},{className:"type",begin:"!<"+a+">"},{className:"type",begin:"!"+a},{className:"type",begin:"!!"+a},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"\\-(?=[ ]|$)",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{className:"number",begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b"},{className:"number",begin:e.C_NUMBER_RE+"\\b"},t,g,s],c=[...b];return c.pop(),c.push(i),l.contains=c,{name:"YAML",case_insensitive:!0,aliases:["yml","YAML"],contains:b}}}()); +hljs.registerLanguage("armasm",function(){"use strict";return function(s){const e={variants:[s.COMMENT("^[ \\t]*(?=#)","$",{relevance:0,excludeBegin:!0}),s.COMMENT("[;@]","$",{relevance:0}),s.C_LINE_COMMENT_MODE,s.C_BLOCK_COMMENT_MODE]};return{name:"ARM Assembly",case_insensitive:!0,aliases:["arm"],keywords:{$pattern:"\\.?"+s.IDENT_RE,meta:".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND ",built_in:"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @"},contains:[{className:"keyword",begin:"\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)"},e,s.QUOTE_STRING_MODE,{className:"string",begin:"'",end:"[^\\\\]'",relevance:0},{className:"title",begin:"\\|",end:"\\|",illegal:"\\n",relevance:0},{className:"number",variants:[{begin:"[#$=]?0x[0-9a-f]+"},{begin:"[#$=]?0b[01]+"},{begin:"[#$=]\\d+"},{begin:"\\b\\d+"}],relevance:0},{className:"symbol",variants:[{begin:"^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:"},{begin:"^[a-z_\\.\\$][a-z0-9_\\.\\$]+"},{begin:"[=#]\\w+"}],relevance:0}]}}}()); +hljs.registerLanguage("d",function(){"use strict";return function(e){var a={$pattern:e.UNDERSCORE_IDENT_RE,keyword:"abstract alias align asm assert auto body break byte case cast catch class const continue debug default delete deprecated do else enum export extern final finally for foreach foreach_reverse|10 goto if immutable import in inout int interface invariant is lazy macro mixin module new nothrow out override package pragma private protected public pure ref return scope shared static struct super switch synchronized template this throw try typedef typeid typeof union unittest version void volatile while with __FILE__ __LINE__ __gshared|10 __thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__",built_in:"bool cdouble cent cfloat char creal dchar delegate double dstring float function idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar wstring",literal:"false null true"},d="((0|[1-9][\\d_]*)|0[bB][01_]+|0[xX]([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))",n="\\\\(['\"\\?\\\\abfnrtv]|u[\\dA-Fa-f]{4}|[0-7]{1,3}|x[\\dA-Fa-f]{2}|U[\\dA-Fa-f]{8})|&[a-zA-Z\\d]{2,};",t={className:"number",begin:"\\b"+d+"(L|u|U|Lu|LU|uL|UL)?",relevance:0},_={className:"number",begin:"\\b(((0[xX](([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)\\.([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)|\\.?([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*))[pP][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))|((0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(\\.\\d*|([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)))|\\d+\\.(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)|\\.(0|[1-9][\\d_]*)([eE][+-]?(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d))?))([fF]|L|i|[fF]i|Li)?|"+d+"(i|[fF]i|Li))",relevance:0},r={className:"string",begin:"'("+n+"|.)",end:"'",illegal:"."},i={className:"string",begin:'"',contains:[{begin:n,relevance:0}],end:'"[cwd]?'},s=e.COMMENT("\\/\\+","\\+\\/",{contains:["self"],relevance:10});return{name:"D",keywords:a,contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,s,{className:"string",begin:'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',relevance:10},i,{className:"string",begin:'[rq]"',end:'"[cwd]?',relevance:5},{className:"string",begin:"`",end:"`[cwd]?"},{className:"string",begin:'q"\\{',end:'\\}"'},_,t,r,{className:"meta",begin:"^#!",end:"$",relevance:5},{className:"meta",begin:"#(line)",end:"$",relevance:5},{className:"keyword",begin:"@[a-zA-Z_][a-zA-Z_\\d]*"}]}}}()); +hljs.registerLanguage("handlebars",function(){"use strict";function e(...e){return e.map(e=>(function(e){return e?"string"==typeof e?e:e.source:null})(e)).join("")}return function(n){const a={"builtin-name":"action bindattr collection component concat debugger each each-in get hash if in input link-to loc log lookup mut outlet partial query-params render template textarea unbound unless view with yield"},t=/\[.*?\]/,s=/[^\s!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]+/,i=e("(",/'.*?'/,"|",/".*?"/,"|",t,"|",s,"|",/\.|\//,")+"),r=e("(",t,"|",s,")(?==)"),l={begin:i,lexemes:/[\w.\/]+/},c=n.inherit(l,{keywords:{literal:"true false undefined null"}}),o={begin:/\(/,end:/\)/},m={className:"attr",begin:r,relevance:0,starts:{begin:/=/,end:/=/,starts:{contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,c,o]}}},d={contains:[n.NUMBER_MODE,n.QUOTE_STRING_MODE,n.APOS_STRING_MODE,{begin:/as\s+\|/,keywords:{keyword:"as"},end:/\|/,contains:[{begin:/\w+/}]},m,c,o],returnEnd:!0},g=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/\)/})});o.contains=[g];const u=n.inherit(l,{keywords:a,className:"name",starts:n.inherit(d,{end:/}}/})}),b=n.inherit(l,{keywords:a,className:"name"}),h=n.inherit(l,{className:"name",keywords:a,starts:n.inherit(d,{end:/}}/})});return{name:"Handlebars",aliases:["hbs","html.hbs","html.handlebars","htmlbars"],case_insensitive:!0,subLanguage:"xml",contains:[{begin:/\\\{\{/,skip:!0},{begin:/\\\\(?=\{\{)/,skip:!0},n.COMMENT(/\{\{!--/,/--\}\}/),n.COMMENT(/\{\{!/,/\}\}/),{className:"template-tag",begin:/\{\{\{\{(?!\/)/,end:/\}\}\}\}/,contains:[u],starts:{end:/\{\{\{\{\//,returnEnd:!0,subLanguage:"xml"}},{className:"template-tag",begin:/\{\{\{\{\//,end:/\}\}\}\}/,contains:[b]},{className:"template-tag",begin:/\{\{#/,end:/\}\}/,contains:[u]},{className:"template-tag",begin:/\{\{(?=else\}\})/,end:/\}\}/,keywords:"else"},{className:"template-tag",begin:/\{\{\//,end:/\}\}/,contains:[b]},{className:"template-variable",begin:/\{\{\{/,end:/\}\}\}/,contains:[h]},{className:"template-variable",begin:/\{\{/,end:/\}\}/,contains:[h]}]}}}()); +hljs.registerLanguage("haskell",function(){"use strict";return function(e){var n={variants:[e.COMMENT("--","$"),e.COMMENT("{-","-}",{contains:["self"]})]},i={className:"meta",begin:"{-#",end:"#-}"},a={className:"meta",begin:"^#",end:"$"},s={className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},l={begin:"\\(",end:"\\)",illegal:'"',contains:[i,a,{className:"type",begin:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TITLE_MODE,{begin:"[_a-z][\\w']*"}),n]};return{name:"Haskell",aliases:["hs"],keywords:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",contains:[{beginKeywords:"module",end:"where",keywords:"module where",contains:[l,n],illegal:"\\W\\.|;"},{begin:"\\bimport\\b",end:"$",keywords:"import qualified as hiding",contains:[l,n],illegal:"\\W\\.|;"},{className:"class",begin:"^(\\s*)?(class|instance)\\b",end:"where",keywords:"class family instance where",contains:[s,l,n]},{className:"class",begin:"\\b(data|(new)?type)\\b",end:"$",keywords:"data family type newtype deriving",contains:[i,s,l,{begin:"{",end:"}",contains:l.contains},n]},{beginKeywords:"default",end:"$",contains:[s,l,n]},{beginKeywords:"infix infixl infixr",end:"$",contains:[e.C_NUMBER_MODE,n]},{begin:"\\bforeign\\b",end:"$",keywords:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",contains:[s,e.QUOTE_STRING_MODE,n]},{className:"meta",begin:"#!\\/usr\\/bin\\/env runhaskell",end:"$"},i,a,e.QUOTE_STRING_MODE,e.C_NUMBER_MODE,s,e.inherit(e.TITLE_MODE,{begin:"^[_a-z][\\w']*"}),n,{begin:"->|<-"}]}}}()); +hljs.registerLanguage("julia",function(){"use strict";return function(e){var r="[A-Za-z_\\u00A1-\\uFFFF][A-Za-z_0-9\\u00A1-\\uFFFF]*",t={$pattern:r,keyword:"in isa where baremodule begin break catch ccall const continue do else elseif end export false finally for function global if import importall let local macro module quote return true try using while type immutable abstract bitstype typealias ",literal:"true false ARGS C_NULL DevNull ENDIAN_BOM ENV I Inf Inf16 Inf32 Inf64 InsertionSort JULIA_HOME LOAD_PATH MergeSort NaN NaN16 NaN32 NaN64 PROGRAM_FILE QuickSort RoundDown RoundFromZero RoundNearest RoundNearestTiesAway RoundNearestTiesUp RoundToZero RoundUp STDERR STDIN STDOUT VERSION catalan e|0 eu|0 eulergamma golden im nothing pi γ π φ ",built_in:"ANY AbstractArray AbstractChannel AbstractFloat AbstractMatrix AbstractRNG AbstractSerializer AbstractSet AbstractSparseArray AbstractSparseMatrix AbstractSparseVector AbstractString AbstractUnitRange AbstractVecOrMat AbstractVector Any ArgumentError Array AssertionError Associative Base64DecodePipe Base64EncodePipe Bidiagonal BigFloat BigInt BitArray BitMatrix BitVector Bool BoundsError BufferStream CachingPool CapturedException CartesianIndex CartesianRange Cchar Cdouble Cfloat Channel Char Cint Cintmax_t Clong Clonglong ClusterManager Cmd CodeInfo Colon Complex Complex128 Complex32 Complex64 CompositeException Condition ConjArray ConjMatrix ConjVector Cptrdiff_t Cshort Csize_t Cssize_t Cstring Cuchar Cuint Cuintmax_t Culong Culonglong Cushort Cwchar_t Cwstring DataType Date DateFormat DateTime DenseArray DenseMatrix DenseVecOrMat DenseVector Diagonal Dict DimensionMismatch Dims DirectIndexString Display DivideError DomainError EOFError EachLine Enum Enumerate ErrorException Exception ExponentialBackOff Expr Factorization FileMonitor Float16 Float32 Float64 Function Future GlobalRef GotoNode HTML Hermitian IO IOBuffer IOContext IOStream IPAddr IPv4 IPv6 IndexCartesian IndexLinear IndexStyle InexactError InitError Int Int128 Int16 Int32 Int64 Int8 IntSet Integer InterruptException InvalidStateException Irrational KeyError LabelNode LinSpace LineNumberNode LoadError LowerTriangular MIME Matrix MersenneTwister Method MethodError MethodTable Module NTuple NewvarNode NullException Nullable Number ObjectIdDict OrdinalRange OutOfMemoryError OverflowError Pair ParseError PartialQuickSort PermutedDimsArray Pipe PollingFileWatcher ProcessExitedException Ptr QuoteNode RandomDevice Range RangeIndex Rational RawFD ReadOnlyMemoryError Real ReentrantLock Ref Regex RegexMatch RemoteChannel RemoteException RevString RoundingMode RowVector SSAValue SegmentationFault SerializationState Set SharedArray SharedMatrix SharedVector Signed SimpleVector Slot SlotNumber SparseMatrixCSC SparseVector StackFrame StackOverflowError StackTrace StepRange StepRangeLen StridedArray StridedMatrix StridedVecOrMat StridedVector String SubArray SubString SymTridiagonal Symbol Symmetric SystemError TCPSocket Task Text TextDisplay Timer Tridiagonal Tuple Type TypeError TypeMapEntry TypeMapLevel TypeName TypeVar TypedSlot UDPSocket UInt UInt128 UInt16 UInt32 UInt64 UInt8 UndefRefError UndefVarError UnicodeError UniformScaling Union UnionAll UnitRange Unsigned UpperTriangular Val Vararg VecElement VecOrMat Vector VersionNumber Void WeakKeyDict WeakRef WorkerConfig WorkerPool "},a={keywords:t,illegal:/<\//},n={className:"subst",begin:/\$\(/,end:/\)/,keywords:t},o={className:"variable",begin:"\\$"+r},i={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],variants:[{begin:/\w*"""/,end:/"""\w*/,relevance:10},{begin:/\w*"/,end:/"\w*/}]},l={className:"string",contains:[e.BACKSLASH_ESCAPE,n,o],begin:"`",end:"`"},s={className:"meta",begin:"@"+r};return a.name="Julia",a.contains=[{className:"number",begin:/(\b0x[\d_]*(\.[\d_]*)?|0x\.\d[\d_]*)p[-+]?\d+|\b0[box][a-fA-F0-9][a-fA-F0-9_]*|(\b\d[\d_]*(\.[\d_]*)?|\.\d[\d_]*)([eEfF][-+]?\d+)?/,relevance:0},{className:"string",begin:/'(.|\\[xXuU][a-zA-Z0-9]+)'/},i,l,s,{className:"comment",variants:[{begin:"#=",end:"=#",relevance:10},{begin:"#",end:"$"}]},e.HASH_COMMENT_MODE,{className:"keyword",begin:"\\b(((abstract|primitive)\\s+)type|(mutable\\s+)?struct)\\b"},{begin:/<:/}],n.contains=a.contains,a}}()); +hljs.registerLanguage("nim",function(){"use strict";return function(e){return{name:"Nim",aliases:["nim"],keywords:{keyword:"addr and as asm bind block break case cast const continue converter discard distinct div do elif else end enum except export finally for from func generic if import in include interface is isnot iterator let macro method mixin mod nil not notin object of or out proc ptr raise ref return shl shr static template try tuple type using var when while with without xor yield",literal:"shared guarded stdin stdout stderr result true false",built_in:"int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float float32 float64 bool char string cstring pointer expr stmt void auto any range array openarray varargs seq set clong culong cchar cschar cshort cint csize clonglong cfloat cdouble clongdouble cuchar cushort cuint culonglong cstringarray semistatic"},contains:[{className:"meta",begin:/{\./,end:/\.}/,relevance:10},{className:"string",begin:/[a-zA-Z]\w*"/,end:/"/,contains:[{begin:/""/}]},{className:"string",begin:/([a-zA-Z]\w*)?"""/,end:/"""/},e.QUOTE_STRING_MODE,{className:"type",begin:/\b[A-Z]\w+\b/,relevance:0},{className:"number",relevance:0,variants:[{begin:/\b(0[xX][0-9a-fA-F][_0-9a-fA-F]*)('?[iIuU](8|16|32|64))?/},{begin:/\b(0o[0-7][_0-7]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(0(b|B)[01][_01]*)('?[iIuUfF](8|16|32|64))?/},{begin:/\b(\d[_\d]*)('?[iIuUfF](8|16|32|64))?/}]},e.HASH_COMMENT_MODE]}}}()); +hljs.registerLanguage("nix",function(){"use strict";return function(e){var n={keyword:"rec with let in inherit assert if else then",literal:"true false or and null",built_in:"import abort baseNameOf dirOf isNull builtins map removeAttrs throw toString derivation"},i={className:"subst",begin:/\$\{/,end:/}/,keywords:n},t={className:"string",contains:[i],variants:[{begin:"''",end:"''"},{begin:'"',end:'"'}]},s=[e.NUMBER_MODE,e.HASH_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,t,{begin:/[a-zA-Z0-9-_]+(\s*=)/,returnBegin:!0,relevance:0,contains:[{className:"attr",begin:/\S+/}]}];return i.contains=s,{name:"Nix",aliases:["nixos"],keywords:n,contains:s}}}()); +hljs.registerLanguage("r",function(){"use strict";return function(e){var n="([a-zA-Z]|\\.[a-zA-Z.])[a-zA-Z0-9._]*";return{name:"R",contains:[e.HASH_COMMENT_MODE,{begin:n,keywords:{$pattern:n,keyword:"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...",literal:"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10"},relevance:0},{className:"number",begin:"0[xX][0-9a-fA-F]+[Li]?\\b",relevance:0},{className:"number",begin:"\\d+(?:[eE][+\\-]?\\d*)?L\\b",relevance:0},{className:"number",begin:"\\d+\\.(?!\\d)(?:i\\b)?",relevance:0},{className:"number",begin:"\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{className:"number",begin:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",relevance:0},{begin:"`",end:"`",relevance:0},{className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{begin:'"',end:'"'},{begin:"'",end:"'"}]}]}}}()); +hljs.registerLanguage("scala",function(){"use strict";return function(e){var n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"},{begin:"\\${",end:"}"}]},a={className:"string",variants:[{begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{begin:'"""',end:'"""',relevance:10},{begin:'[a-z]+"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE,n]},{className:"string",begin:'[a-z]+"""',end:'"""',contains:[n],relevance:10}]},s={className:"type",begin:"\\b[A-Z][A-Za-z0-9_]*",relevance:0},t={className:"title",begin:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,relevance:0},i={className:"class",beginKeywords:"class object trait type",end:/[:={\[\n;]/,excludeEnd:!0,contains:[{beginKeywords:"extends with",relevance:10},{begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,relevance:0,contains:[s]},t]},l={className:"function",beginKeywords:"def",end:/[:={\[(\n;]/,excludeEnd:!0,contains:[t]};return{name:"Scala",keywords:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,a,{className:"symbol",begin:"'\\w[\\w\\d_]*(?!')"},s,l,i,e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"}]}}}()); +hljs.registerLanguage("x86asm",function(){"use strict";return function(s){return{name:"Intel x86 Assembly",case_insensitive:!0,keywords:{$pattern:"[.%]?"+s.IDENT_RE,keyword:"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63",built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},contains:[s.COMMENT(";","$",{relevance:0}),{className:"number",variants:[{begin:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",relevance:0},{begin:"\\$[0-9][0-9A-Fa-f]*",relevance:0},{begin:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{begin:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},s.QUOTE_STRING_MODE,{className:"string",variants:[{begin:"'",end:"[^\\\\]'"},{begin:"`",end:"[^\\\\]`"}],relevance:0},{className:"symbol",variants:[{begin:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{begin:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],relevance:0},{className:"subst",begin:"%[0-9]+",relevance:0},{className:"subst",begin:"%!S+",relevance:0},{className:"meta",begin:/^\s*\.[\w_-]+/}]}}}()); \ No newline at end of file diff --git a/today/book/index.html b/today/book/index.html new file mode 100644 index 0000000..0462385 --- /dev/null +++ b/today/book/index.html @@ -0,0 +1,266 @@ + + + + + + Today - By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025/6/11

+

AI产品与功能更新

+
    +
  1. 豆包大模型家族将在2025 FORCE原动力大会上,重磅发布全新的豆包·视频生成模型。这款模型可谓"创意魔法棒”,它凭借高效结构和多任务统一建模等黑科技,不仅支持无缝多镜头叙事,还能精准响应多动作,甚至能像专业摄影师一样随心运镜,轻松生成写实、动漫等多种风格的高品质视频,简直是视频创作者的福音! +
    图片
  2. +
  3. xAI开发的Grok人工智能正大刀阔斧地接管X平台的推荐算法,同时优化了评论排序机制。这意味着,平台将优先推荐高质量内容,而非仅仅看粉丝量,这无疑给那些粉丝较少但有真材实料的"小号”和新人带来了前所未有的曝光机会,旨在打造一个更公平、更开放的内容生态,让好内容不再"蒙尘”。 +
    图片
  4. +
  5. 豆包App近期也对"一句话P图”功能进行了全面升级,它基于强大的SeedEdit 3.0模型,新增了一键添加/替换文字、质感风格迁移和局部图像编辑增强等一系列酷炫修图玩法。这波升级简直是把专业修图师请进了手机,让普通用户也能无需专业技能,轻松搞定个性化照片创作,让"修图小白”也能变身"修图大师”。 +
    图片
  6. +
  7. 苹果在WWDC 2025大会上带来了iOS 26系统的"杀手级”功能——视觉智能。有了它,你可以在屏幕上的任何图片或信息上进行提问、搜索,甚至自动识别事件详情,简直是手机的"智能眼”。这项升级通过AI技术实现了屏幕内容的"一眼识别”,大大提升了交互体验的便捷性与智能化程度,还能自动提取事件信息加入日历,让你的数字生活更加省心。 +
    图片
  8. +
  9. 好消息!沉浸式翻译迎来重大更新,现在已能对推特(X)视频进行实时翻译。即便视频没有原生字幕,它也能帮你"神同步”地显示中英双语字幕。这下,刷X平台视频再也不用担心语言不通了,简直是跨文化交流的"神助攻”,彻底消除了语言障碍,让世界更近。 +Link
  10. +
+

AI前沿研究

+
    +
  1. 香港大学和华为诺亚方舟实验室强强联手,推出了颠覆性的FUDOKI模型。这款模型采用非掩码离散流匹配架构,成功突破了传统自回归模型的束缚,实现了更加灵活高效的多模态生成与理解能力。它通过独特的并行去噪机制,显著提升了复杂推理和生成任务的表现,尤其在图像生成方面表现惊艳,为未来通用人工智能的发展铺平了道路。 +
    图片
  2. +
  3. 香港科技大学和快手科技的研究团队联合发布了EvoSearch(进化搜索)技术,这简直是AI作画领域的一股清流!它彻底颠覆了以往"大模型、大算力”的固有思维,巧妙地将达尔文的进化论思想融入AI生成过程,让那些"小个子”模型也能生成超越甚至媲美"大块头”的高质量图像和视频。这项突破性技术有望开启AI创作的**"智能进化”时代**,让AI模型在推理阶段释放更深层次的潜力。相关项目主页、代码和论文链接已发布:https://tinnerhrhe.github.io/evosearch/https://github.com/tinnerhrhe/EvoSearch-codeshttps://arxiv.org/abs/2505.17618。 +
    图片
    +
    图片
  4. +
  5. 一篇名为"玩中泛化:通过游戏学习推理”的学术论文揭示了令人兴奋的发现:多模态大型语言模型(MLLMs)通过玩简单的街机游戏,竟然能显著提升其跨领域的多模态推理能力,甚至超越了在特定数据上训练的专业模型!这无疑为未来通用AI能力的培养指明了一条充满趣味的新方向,让AI在"玩乐”中变得更聪明。 +此链接
  6. +
  7. 新论文《梦境之地》(Dreamland)提出了一种结合物理模拟器与大型生成模型的混合框架。它的目标是创造出高度可控且逼真的动态虚拟世界,不仅显著提升了图像质量与可控性,更重要的是,有望为具身AI智能体的训练提供一个理想的"游乐场”和"实验室”,助力AI在现实世界中更好地学习和行动。 +Link
  8. +
+

AI行业展望与社会影响

+
    +
  1. 理想汽车近期进行了组织架构的"大变身”,正式成立了**"空间机器人”"穿戴机器人”两个全新的二级部门。这不仅仅是部门调整,更预示着理想汽车正从传统的汽车制造商转型为智能出行生态构建者**。他们旨在通过机器人技术,构建一个涵盖车内"第三空间”和车外智能穿戴设备的完整智能生活服务体系,这无疑将为理想汽车在竞争激烈的市场中带来新的差异化优势,让"第三空间”战略不再只是一个概念。 +
    理想汽车
  2. +
  3. 俄亥俄州立大学宣布从今年起,将强制所有学生接受人工智能(AI)培训,这简直是为未来职场"量身定制”的技能包!学校推出了**"AI流利度”计划**,将AI教育全面融入本科生课程,旨在培养学生将专业知识与AI技术有效结合的能力。当然,学校也强调学生不得利用生成性AI来"蒙混过关”,同时加强教师培训以维护学术诚信。此举旨在确保每位毕业生都能在其专业领域有效应用AI,并积极响应俄亥俄州AI教育联盟在K-12教育中推动AI教育的努力,让AI真正成为每个人的"超级助手”。 +
    学习 考试 高考 教育 (1)
  4. +
  5. 知名思考者李继刚一针见血地指出,当AI技术变得越发高效强大时,人类的判断力品味和对事物目的的理解反而会变得更为硬核。因为AI虽然能生成万千方案并完美执行,却无法替代人类进行选择、定义,更无法洞悉复杂且深邃的人性。这提醒我们,在AI时代,真正有价值的,或许正是那些AI无法企及的"人类专属技能”。 +Link
  6. +
+

开源TOP项目

+
    +
  1. 小红书的 hi lab 团队近日献出了一份"大礼”——首个开源文本大模型dots.llm1!这款拥有1420亿参数的混合专家(MoE)语言模型,在海量真实数据训练后,其性能竟然能媲美阿里巴巴的Qwen2.5-72B,这简直是模型界的"黑马”!此次开源不仅彰显了小红书在人工智能领域的技术雄心,更旨在提供更智能化的服务,并激励开发者们一起加入AI研究的"大合唱”。 +
    图片
  2. +
  3. 近期,GitHub上两个AI相关的项目人气爆棚。其中,拥有10785星的"newsnow”项目,它旨在为用户提供优雅的实时热点新闻阅读体验,让信息获取既便捷又高效,简直是"新闻控”的福音,地址在这里:此链接。另一个是"GenAI_Agents”项目,以12884星的高热度,为开发者提供了从基础到高级的生成式AI智能体技术教程与实现,旨在赋能构建更智能的交互式AI系统,详情可访问:此链接
  4. +
+

社媒分享

+
    +
  1. Gorden Sun在社交媒体上分享了Mirage虚拟人模型产品,这款产品简直是"数字分身”的魔法师!它能通过音频驱动,生成生动、嘴型同步且表情丰富的虚拟人视频,栩栩如生。Gorden Sun还特别强调,该产品的详细技术报告对研究人员具有极高的参考价值,看来又将引发一场虚拟人技术的"军备竞赛”。 +Link
  2. +
  3. Sam Altman在X平台发文宣布,o3产品价格已大幅下调80%,这简直是"福利大放送”!他表达了对用户创新使用的期待,并预告了o3-pro版本也将提供令人满意的定价。看来,Sora之父又在鼓励大家放开手脚,用更低的成本去探索AI的无限可能了。 +Link
  4. +
  5. Ryan ᵐᶠᵉʳ 🦄d/acc抛出了一个关于下一代创业者的深刻观点:他们不应被束缚于模仿乔布斯等前代成功模式,也不应受限于有限的低质量输入,而应忠于自我,以独特的"vibe”和玩乐精神自由探索。这就像在说,别做别人的影子,去创造属于你自己的"游戏规则”! +Link
  6. +
  7. 用户wwwgoubuli分享了AI在实际工作中的一个有趣转变。他提到,远程团队成员初时因担心被视为偷懒而不敢充分使用AI,但在他多次分享AI"正确用法”后,团队逐渐"放开手脚”,结果代码的注释、规范和质量均显著提升,同事们也展现出更高的自信。这简直是AI赋能团队效率提升的"教科书式”案例,打破了心中的"AI焦虑”。 +Link
  8. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/mark.min.js b/today/book/mark.min.js new file mode 100644 index 0000000..1636231 --- /dev/null +++ b/today/book/mark.min.js @@ -0,0 +1,7 @@ +/*!*************************************************** +* mark.js v8.11.1 +* https://markjs.io/ +* Copyright (c) 2014–2018, Julian Kühnel +* Released under the MIT license https://git.io/vwTVl +*****************************************************/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Mark=t()}(this,function(){"use strict";var e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},n=function(){function e(e,t){for(var n=0;n1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:5e3;t(this,e),this.ctx=n,this.iframes=r,this.exclude=i,this.iframesTimeout=o}return n(e,[{key:"getContexts",value:function(){var e=[];return(void 0!==this.ctx&&this.ctx?NodeList.prototype.isPrototypeOf(this.ctx)?Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?this.ctx:"string"==typeof this.ctx?Array.prototype.slice.call(document.querySelectorAll(this.ctx)):[this.ctx]:[]).forEach(function(t){var n=e.filter(function(e){return e.contains(t)}).length>0;-1!==e.indexOf(t)||n||e.push(t)}),e}},{key:"getIframeContents",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=void 0;try{var i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch(e){n()}r&&t(r)}},{key:"isIframeBlank",value:function(e){var t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}},{key:"observeIframeLoad",value:function(e,t,n){var r=this,i=!1,o=null,a=function a(){if(!i){i=!0,clearTimeout(o);try{r.isIframeBlank(e)||(e.removeEventListener("load",a),r.getIframeContents(e,t,n))}catch(e){n()}}};e.addEventListener("load",a),o=setTimeout(a,this.iframesTimeout)}},{key:"onIframeReady",value:function(e,t,n){try{"complete"===e.contentWindow.document.readyState?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch(e){n()}}},{key:"waitForIframes",value:function(e,t){var n=this,r=0;this.forEachIframe(e,function(){return!0},function(e){r++,n.waitForIframes(e.querySelector("html"),function(){--r||t()})},function(e){e||t()})}},{key:"forEachIframe",value:function(t,n,r){var i=this,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},a=t.querySelectorAll("iframe"),s=a.length,c=0;a=Array.prototype.slice.call(a);var u=function(){--s<=0&&o(c)};s||u(),a.forEach(function(t){e.matches(t,i.exclude)?u():i.onIframeReady(t,function(e){n(t)&&(c++,r(e)),u()},u)})}},{key:"createIterator",value:function(e,t,n){return document.createNodeIterator(e,t,n,!1)}},{key:"createInstanceOnIframe",value:function(t){return new e(t.querySelector("html"),this.iframes)}},{key:"compareNodeIframe",value:function(e,t,n){if(e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_PRECEDING){if(null===t)return!0;if(t.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING)return!0}return!1}},{key:"getIteratorNode",value:function(e){var t=e.previousNode();return{prevNode:t,node:null===t?e.nextNode():e.nextNode()&&e.nextNode()}}},{key:"checkIframeFilter",value:function(e,t,n,r){var i=!1,o=!1;return r.forEach(function(e,t){e.val===n&&(i=t,o=e.handled)}),this.compareNodeIframe(e,t,n)?(!1!==i||o?!1===i||o||(r[i].handled=!0):r.push({val:n,handled:!0}),!0):(!1===i&&r.push({val:n,handled:!1}),!1)}},{key:"handleOpenIframes",value:function(e,t,n,r){var i=this;e.forEach(function(e){e.handled||i.getIframeContents(e.val,function(e){i.createInstanceOnIframe(e).forEachNode(t,n,r)})})}},{key:"iterateThroughNodes",value:function(e,t,n,r,i){for(var o,a=this,s=this.createIterator(t,e,r),c=[],u=[],l=void 0,h=void 0;void 0,o=a.getIteratorNode(s),h=o.prevNode,l=o.node;)this.iframes&&this.forEachIframe(t,function(e){return a.checkIframeFilter(l,h,e,c)},function(t){a.createInstanceOnIframe(t).forEachNode(e,function(e){return u.push(e)},r)}),u.push(l);u.forEach(function(e){n(e)}),this.iframes&&this.handleOpenIframes(c,e,n,r),i()}},{key:"forEachNode",value:function(e,t,n){var r=this,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:function(){},o=this.getContexts(),a=o.length;a||i(),o.forEach(function(o){var s=function(){r.iterateThroughNodes(e,o,t,n,function(){--a<=0&&i()})};r.iframes?r.waitForIframes(o,s):s()})}}],[{key:"matches",value:function(e,t){var n="string"==typeof t?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){var i=!1;return n.every(function(t){return!r.call(e,t)||(i=!0,!1)}),i}return!1}}]),e}(),o=function(){function e(n){t(this,e),this.opt=r({},{diacritics:!0,synonyms:{},accuracy:"partially",caseSensitive:!1,ignoreJoiners:!1,ignorePunctuation:[],wildcards:"disabled"},n)}return n(e,[{key:"create",value:function(e){return"disabled"!==this.opt.wildcards&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),"disabled"!==this.opt.wildcards&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),new RegExp(e,"gm"+(this.opt.caseSensitive?"":"i"))}},{key:"escapeStr",value:function(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}},{key:"createSynonymsRegExp",value:function(e){var t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(var i in t)if(t.hasOwnProperty(i)){var o=t[i],a="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(i):this.escapeStr(i),s="disabled"!==this.opt.wildcards?this.setupWildcardsRegExp(o):this.escapeStr(o);""!==a&&""!==s&&(e=e.replace(new RegExp("("+this.escapeStr(a)+"|"+this.escapeStr(s)+")","gm"+n),r+"("+this.processSynonyms(a)+"|"+this.processSynonyms(s)+")"+r))}return e}},{key:"processSynonyms",value:function(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}},{key:"setupWildcardsRegExp",value:function(e){return(e=e.replace(/(?:\\)*\?/g,function(e){return"\\"===e.charAt(0)?"?":""})).replace(/(?:\\)*\*/g,function(e){return"\\"===e.charAt(0)?"*":""})}},{key:"createWildcardsRegExp",value:function(e){var t="withSpaces"===this.opt.wildcards;return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}},{key:"setupIgnoreJoinersRegExp",value:function(e){return e.replace(/[^(|)\\]/g,function(e,t,n){var r=n.charAt(t+1);return/[(|)\\]/.test(r)||""===r?e:e+"\0"})}},{key:"createJoinersRegExp",value:function(e){var t=[],n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join("["+t.join("")+"]*"):e}},{key:"createDiacriticsRegExp",value:function(e){var t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"],r=[];return e.split("").forEach(function(i){n.every(function(n){if(-1!==n.indexOf(i)){if(r.indexOf(n)>-1)return!1;e=e.replace(new RegExp("["+n+"]","gm"+t),"["+n+"]"),r.push(n)}return!0})}),e}},{key:"createMergedBlanksRegExp",value:function(e){return e.replace(/[\s]+/gim,"[\\s]+")}},{key:"createAccuracyRegExp",value:function(e){var t=this,n=this.opt.accuracy,r="string"==typeof n?n:n.value,i="";switch(("string"==typeof n?[]:n.limiters).forEach(function(e){i+="|"+t.escapeStr(e)}),r){case"partially":default:return"()("+e+")";case"complementary":return"()([^"+(i="\\s"+(i||this.escapeStr("!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿")))+"]*"+e+"[^"+i+"]*)";case"exactly":return"(^|\\s"+i+")("+e+")(?=$|\\s"+i+")"}}}]),e}(),a=function(){function a(e){t(this,a),this.ctx=e,this.ie=!1;var n=window.navigator.userAgent;(n.indexOf("MSIE")>-1||n.indexOf("Trident")>-1)&&(this.ie=!0)}return n(a,[{key:"log",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"debug",r=this.opt.log;this.opt.debug&&"object"===(void 0===r?"undefined":e(r))&&"function"==typeof r[n]&&r[n]("mark.js: "+t)}},{key:"getSeparatedKeywords",value:function(e){var t=this,n=[];return e.forEach(function(e){t.opt.separateWordSearch?e.split(" ").forEach(function(e){e.trim()&&-1===n.indexOf(e)&&n.push(e)}):e.trim()&&-1===n.indexOf(e)&&n.push(e)}),{keywords:n.sort(function(e,t){return t.length-e.length}),length:n.length}}},{key:"isNumeric",value:function(e){return Number(parseFloat(e))==e}},{key:"checkRanges",value:function(e){var t=this;if(!Array.isArray(e)||"[object Object]"!==Object.prototype.toString.call(e[0]))return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];var n=[],r=0;return e.sort(function(e,t){return e.start-t.start}).forEach(function(e){var i=t.callNoMatchOnInvalidRanges(e,r),o=i.start,a=i.end;i.valid&&(e.start=o,e.length=a-o,n.push(e),r=a)}),n}},{key:"callNoMatchOnInvalidRanges",value:function(e,t){var n=void 0,r=void 0,i=!1;return e&&void 0!==e.start?(r=(n=parseInt(e.start,10))+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log("Ignoring invalid or overlapping range: "+JSON.stringify(e)),this.opt.noMatch(e))):(this.log("Ignoring invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:n,end:r,valid:i}}},{key:"checkWhitespaceRanges",value:function(e,t,n){var r=void 0,i=!0,o=n.length,a=t-o,s=parseInt(e.start,10)-a;return(r=(s=s>o?o:s)+parseInt(e.length,10))>o&&(r=o,this.log("End range automatically set to the max value of "+o)),s<0||r-s<0||s>o||r>o?(i=!1,this.log("Invalid range: "+JSON.stringify(e)),this.opt.noMatch(e)):""===n.substring(s,r).replace(/\s+/g,"")&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:s,end:r,valid:i}}},{key:"getTextNodes",value:function(e){var t=this,n="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,function(e){r.push({start:n.length,end:(n+=e.textContent).length,node:e})},function(e){return t.matchesExclude(e.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},function(){e({value:n,nodes:r})})}},{key:"matchesExclude",value:function(e){return i.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}},{key:"wrapRangeInTextNode",value:function(e,t,n){var r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),o=i.splitText(n-t),a=document.createElement(r);return a.setAttribute("data-markjs","true"),this.opt.className&&a.setAttribute("class",this.opt.className),a.textContent=i.textContent,i.parentNode.replaceChild(a,i),o}},{key:"wrapRangeInMappedTextNode",value:function(e,t,n,r,i){var o=this;e.nodes.every(function(a,s){var c=e.nodes[s+1];if(void 0===c||c.start>t){if(!r(a.node))return!1;var u=t-a.start,l=(n>a.end?a.end:n)-a.start,h=e.value.substr(0,a.start),f=e.value.substr(l+a.start);if(a.node=o.wrapRangeInTextNode(a.node,u,l),e.value=h+f,e.nodes.forEach(function(t,n){n>=s&&(e.nodes[n].start>0&&n!==s&&(e.nodes[n].start-=l),e.nodes[n].end-=l)}),n-=l,i(a.node.previousSibling,a.start),!(n>a.end))return!1;t=a.end}return!0})}},{key:"wrapGroups",value:function(e,t,n,r){return r((e=this.wrapRangeInTextNode(e,t,t+n)).previousSibling),e}},{key:"separateGroups",value:function(e,t,n,r,i){for(var o=t.length,a=1;a-1&&r(t[a],e)&&(e=this.wrapGroups(e,s,t[a].length,i))}return e}},{key:"wrapMatches",value:function(e,t,n,r,i){var o=this,a=0===t?0:t+1;this.getTextNodes(function(t){t.nodes.forEach(function(t){t=t.node;for(var i=void 0;null!==(i=e.exec(t.textContent))&&""!==i[a];){if(o.opt.separateGroups)t=o.separateGroups(t,i,a,n,r);else{if(!n(i[a],t))continue;var s=i.index;if(0!==a)for(var c=1;c + + + + + By 何夕2077 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Keyboard shortcuts

+
+

Press or to navigate between chapters

+

Press S or / to search in the book

+

Press ? to show this help

+

Press Esc to hide this help

+
+
+
+
+ + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+
+

AI洞察日报 2025/6/11

+

AI产品与功能更新

+
    +
  1. 豆包大模型家族将在2025 FORCE原动力大会上,重磅发布全新的豆包·视频生成模型。这款模型可谓"创意魔法棒”,它凭借高效结构和多任务统一建模等黑科技,不仅支持无缝多镜头叙事,还能精准响应多动作,甚至能像专业摄影师一样随心运镜,轻松生成写实、动漫等多种风格的高品质视频,简直是视频创作者的福音! +
    图片
  2. +
  3. xAI开发的Grok人工智能正大刀阔斧地接管X平台的推荐算法,同时优化了评论排序机制。这意味着,平台将优先推荐高质量内容,而非仅仅看粉丝量,这无疑给那些粉丝较少但有真材实料的"小号”和新人带来了前所未有的曝光机会,旨在打造一个更公平、更开放的内容生态,让好内容不再"蒙尘”。 +
    图片
  4. +
  5. 豆包App近期也对"一句话P图”功能进行了全面升级,它基于强大的SeedEdit 3.0模型,新增了一键添加/替换文字、质感风格迁移和局部图像编辑增强等一系列酷炫修图玩法。这波升级简直是把专业修图师请进了手机,让普通用户也能无需专业技能,轻松搞定个性化照片创作,让"修图小白”也能变身"修图大师”。 +
    图片
  6. +
  7. 苹果在WWDC 2025大会上带来了iOS 26系统的"杀手级”功能——视觉智能。有了它,你可以在屏幕上的任何图片或信息上进行提问、搜索,甚至自动识别事件详情,简直是手机的"智能眼”。这项升级通过AI技术实现了屏幕内容的"一眼识别”,大大提升了交互体验的便捷性与智能化程度,还能自动提取事件信息加入日历,让你的数字生活更加省心。 +
    图片
  8. +
  9. 好消息!沉浸式翻译迎来重大更新,现在已能对推特(X)视频进行实时翻译。即便视频没有原生字幕,它也能帮你"神同步”地显示中英双语字幕。这下,刷X平台视频再也不用担心语言不通了,简直是跨文化交流的"神助攻”,彻底消除了语言障碍,让世界更近。 +Link
  10. +
+

AI前沿研究

+
    +
  1. 香港大学和华为诺亚方舟实验室强强联手,推出了颠覆性的FUDOKI模型。这款模型采用非掩码离散流匹配架构,成功突破了传统自回归模型的束缚,实现了更加灵活高效的多模态生成与理解能力。它通过独特的并行去噪机制,显著提升了复杂推理和生成任务的表现,尤其在图像生成方面表现惊艳,为未来通用人工智能的发展铺平了道路。 +
    图片
  2. +
  3. 香港科技大学和快手科技的研究团队联合发布了EvoSearch(进化搜索)技术,这简直是AI作画领域的一股清流!它彻底颠覆了以往"大模型、大算力”的固有思维,巧妙地将达尔文的进化论思想融入AI生成过程,让那些"小个子”模型也能生成超越甚至媲美"大块头”的高质量图像和视频。这项突破性技术有望开启AI创作的**"智能进化”时代**,让AI模型在推理阶段释放更深层次的潜力。相关项目主页、代码和论文链接已发布:https://tinnerhrhe.github.io/evosearch/https://github.com/tinnerhrhe/EvoSearch-codeshttps://arxiv.org/abs/2505.17618。 +
    图片
    +
    图片
  4. +
  5. 一篇名为"玩中泛化:通过游戏学习推理”的学术论文揭示了令人兴奋的发现:多模态大型语言模型(MLLMs)通过玩简单的街机游戏,竟然能显著提升其跨领域的多模态推理能力,甚至超越了在特定数据上训练的专业模型!这无疑为未来通用AI能力的培养指明了一条充满趣味的新方向,让AI在"玩乐”中变得更聪明。 +此链接
  6. +
  7. 新论文《梦境之地》(Dreamland)提出了一种结合物理模拟器与大型生成模型的混合框架。它的目标是创造出高度可控且逼真的动态虚拟世界,不仅显著提升了图像质量与可控性,更重要的是,有望为具身AI智能体的训练提供一个理想的"游乐场”和"实验室”,助力AI在现实世界中更好地学习和行动。 +Link
  8. +
+

AI行业展望与社会影响

+
    +
  1. 理想汽车近期进行了组织架构的"大变身”,正式成立了**"空间机器人”"穿戴机器人”两个全新的二级部门。这不仅仅是部门调整,更预示着理想汽车正从传统的汽车制造商转型为智能出行生态构建者**。他们旨在通过机器人技术,构建一个涵盖车内"第三空间”和车外智能穿戴设备的完整智能生活服务体系,这无疑将为理想汽车在竞争激烈的市场中带来新的差异化优势,让"第三空间”战略不再只是一个概念。 +
    理想汽车
  2. +
  3. 俄亥俄州立大学宣布从今年起,将强制所有学生接受人工智能(AI)培训,这简直是为未来职场"量身定制”的技能包!学校推出了**"AI流利度”计划**,将AI教育全面融入本科生课程,旨在培养学生将专业知识与AI技术有效结合的能力。当然,学校也强调学生不得利用生成性AI来"蒙混过关”,同时加强教师培训以维护学术诚信。此举旨在确保每位毕业生都能在其专业领域有效应用AI,并积极响应俄亥俄州AI教育联盟在K-12教育中推动AI教育的努力,让AI真正成为每个人的"超级助手”。 +
    学习 考试 高考 教育 (1)
  4. +
  5. 知名思考者李继刚一针见血地指出,当AI技术变得越发高效强大时,人类的判断力品味和对事物目的的理解反而会变得更为硬核。因为AI虽然能生成万千方案并完美执行,却无法替代人类进行选择、定义,更无法洞悉复杂且深邃的人性。这提醒我们,在AI时代,真正有价值的,或许正是那些AI无法企及的"人类专属技能”。 +Link
  6. +
+

开源TOP项目

+
    +
  1. 小红书的 hi lab 团队近日献出了一份"大礼”——首个开源文本大模型dots.llm1!这款拥有1420亿参数的混合专家(MoE)语言模型,在海量真实数据训练后,其性能竟然能媲美阿里巴巴的Qwen2.5-72B,这简直是模型界的"黑马”!此次开源不仅彰显了小红书在人工智能领域的技术雄心,更旨在提供更智能化的服务,并激励开发者们一起加入AI研究的"大合唱”。 +
    图片
  2. +
  3. 近期,GitHub上两个AI相关的项目人气爆棚。其中,拥有10785星的"newsnow”项目,它旨在为用户提供优雅的实时热点新闻阅读体验,让信息获取既便捷又高效,简直是"新闻控”的福音,地址在这里:此链接。另一个是"GenAI_Agents”项目,以12884星的高热度,为开发者提供了从基础到高级的生成式AI智能体技术教程与实现,旨在赋能构建更智能的交互式AI系统,详情可访问:此链接
  4. +
+

社媒分享

+
    +
  1. Gorden Sun在社交媒体上分享了Mirage虚拟人模型产品,这款产品简直是"数字分身”的魔法师!它能通过音频驱动,生成生动、嘴型同步且表情丰富的虚拟人视频,栩栩如生。Gorden Sun还特别强调,该产品的详细技术报告对研究人员具有极高的参考价值,看来又将引发一场虚拟人技术的"军备竞赛”。 +Link
  2. +
  3. Sam Altman在X平台发文宣布,o3产品价格已大幅下调80%,这简直是"福利大放送”!他表达了对用户创新使用的期待,并预告了o3-pro版本也将提供令人满意的定价。看来,Sora之父又在鼓励大家放开手脚,用更低的成本去探索AI的无限可能了。 +Link
  4. +
  5. Ryan ᵐᶠᵉʳ 🦄d/acc抛出了一个关于下一代创业者的深刻观点:他们不应被束缚于模仿乔布斯等前代成功模式,也不应受限于有限的低质量输入,而应忠于自我,以独特的"vibe”和玩乐精神自由探索。这就像在说,别做别人的影子,去创造属于你自己的"游戏规则”! +Link
  6. +
  7. 用户wwwgoubuli分享了AI在实际工作中的一个有趣转变。他提到,远程团队成员初时因担心被视为偷懒而不敢充分使用AI,但在他多次分享AI"正确用法”后,团队逐渐"放开手脚”,结果代码的注释、规范和质量均显著提升,同事们也展现出更高的自信。这简直是AI赋能团队效率提升的"教科书式”案例,打破了心中的"AI焦虑”。 +Link
  8. +
+

AI洞察日报 2025/6/11

+

AI产品与功能更新

+
    +
  1. 豆包大模型家族将在2025 FORCE原动力大会上,重磅发布全新的豆包·视频生成模型。这款模型可谓"创意魔法棒”,它凭借高效结构和多任务统一建模等黑科技,不仅支持无缝多镜头叙事,还能精准响应多动作,甚至能像专业摄影师一样随心运镜,轻松生成写实、动漫等多种风格的高品质视频,简直是视频创作者的福音! +
    图片
  2. +
  3. xAI开发的Grok人工智能正大刀阔斧地接管X平台的推荐算法,同时优化了评论排序机制。这意味着,平台将优先推荐高质量内容,而非仅仅看粉丝量,这无疑给那些粉丝较少但有真材实料的"小号”和新人带来了前所未有的曝光机会,旨在打造一个更公平、更开放的内容生态,让好内容不再"蒙尘”。 +
    图片
  4. +
  5. 豆包App近期也对"一句话P图”功能进行了全面升级,它基于强大的SeedEdit 3.0模型,新增了一键添加/替换文字、质感风格迁移和局部图像编辑增强等一系列酷炫修图玩法。这波升级简直是把专业修图师请进了手机,让普通用户也能无需专业技能,轻松搞定个性化照片创作,让"修图小白”也能变身"修图大师”。 +
    图片
  6. +
  7. 苹果在WWDC 2025大会上带来了iOS 26系统的"杀手级”功能——视觉智能。有了它,你可以在屏幕上的任何图片或信息上进行提问、搜索,甚至自动识别事件详情,简直是手机的"智能眼”。这项升级通过AI技术实现了屏幕内容的"一眼识别”,大大提升了交互体验的便捷性与智能化程度,还能自动提取事件信息加入日历,让你的数字生活更加省心。 +
    图片
  8. +
  9. 好消息!沉浸式翻译迎来重大更新,现在已能对推特(X)视频进行实时翻译。即便视频没有原生字幕,它也能帮你"神同步”地显示中英双语字幕。这下,刷X平台视频再也不用担心语言不通了,简直是跨文化交流的"神助攻”,彻底消除了语言障碍,让世界更近。 +Link
  10. +
+

AI前沿研究

+
    +
  1. 香港大学和华为诺亚方舟实验室强强联手,推出了颠覆性的FUDOKI模型。这款模型采用非掩码离散流匹配架构,成功突破了传统自回归模型的束缚,实现了更加灵活高效的多模态生成与理解能力。它通过独特的并行去噪机制,显著提升了复杂推理和生成任务的表现,尤其在图像生成方面表现惊艳,为未来通用人工智能的发展铺平了道路。 +
    图片
  2. +
  3. 香港科技大学和快手科技的研究团队联合发布了EvoSearch(进化搜索)技术,这简直是AI作画领域的一股清流!它彻底颠覆了以往"大模型、大算力”的固有思维,巧妙地将达尔文的进化论思想融入AI生成过程,让那些"小个子”模型也能生成超越甚至媲美"大块头”的高质量图像和视频。这项突破性技术有望开启AI创作的**"智能进化”时代**,让AI模型在推理阶段释放更深层次的潜力。相关项目主页、代码和论文链接已发布:https://tinnerhrhe.github.io/evosearch/https://github.com/tinnerhrhe/EvoSearch-codeshttps://arxiv.org/abs/2505.17618。 +
    图片
    +
    图片
  4. +
  5. 一篇名为"玩中泛化:通过游戏学习推理”的学术论文揭示了令人兴奋的发现:多模态大型语言模型(MLLMs)通过玩简单的街机游戏,竟然能显著提升其跨领域的多模态推理能力,甚至超越了在特定数据上训练的专业模型!这无疑为未来通用AI能力的培养指明了一条充满趣味的新方向,让AI在"玩乐”中变得更聪明。 +此链接
  6. +
  7. 新论文《梦境之地》(Dreamland)提出了一种结合物理模拟器与大型生成模型的混合框架。它的目标是创造出高度可控且逼真的动态虚拟世界,不仅显著提升了图像质量与可控性,更重要的是,有望为具身AI智能体的训练提供一个理想的"游乐场”和"实验室”,助力AI在现实世界中更好地学习和行动。 +Link
  8. +
+

AI行业展望与社会影响

+
    +
  1. 理想汽车近期进行了组织架构的"大变身”,正式成立了**"空间机器人”"穿戴机器人”两个全新的二级部门。这不仅仅是部门调整,更预示着理想汽车正从传统的汽车制造商转型为智能出行生态构建者**。他们旨在通过机器人技术,构建一个涵盖车内"第三空间”和车外智能穿戴设备的完整智能生活服务体系,这无疑将为理想汽车在竞争激烈的市场中带来新的差异化优势,让"第三空间”战略不再只是一个概念。 +
    理想汽车
  2. +
  3. 俄亥俄州立大学宣布从今年起,将强制所有学生接受人工智能(AI)培训,这简直是为未来职场"量身定制”的技能包!学校推出了**"AI流利度”计划**,将AI教育全面融入本科生课程,旨在培养学生将专业知识与AI技术有效结合的能力。当然,学校也强调学生不得利用生成性AI来"蒙混过关”,同时加强教师培训以维护学术诚信。此举旨在确保每位毕业生都能在其专业领域有效应用AI,并积极响应俄亥俄州AI教育联盟在K-12教育中推动AI教育的努力,让AI真正成为每个人的"超级助手”。 +
    学习 考试 高考 教育 (1)
  4. +
  5. 知名思考者李继刚一针见血地指出,当AI技术变得越发高效强大时,人类的判断力品味和对事物目的的理解反而会变得更为硬核。因为AI虽然能生成万千方案并完美执行,却无法替代人类进行选择、定义,更无法洞悉复杂且深邃的人性。这提醒我们,在AI时代,真正有价值的,或许正是那些AI无法企及的"人类专属技能”。 +Link
  6. +
+

开源TOP项目

+
    +
  1. 小红书的 hi lab 团队近日献出了一份"大礼”——首个开源文本大模型dots.llm1!这款拥有1420亿参数的混合专家(MoE)语言模型,在海量真实数据训练后,其性能竟然能媲美阿里巴巴的Qwen2.5-72B,这简直是模型界的"黑马”!此次开源不仅彰显了小红书在人工智能领域的技术雄心,更旨在提供更智能化的服务,并激励开发者们一起加入AI研究的"大合唱”。 +
    图片
  2. +
  3. 近期,GitHub上两个AI相关的项目人气爆棚。其中,拥有10785星的"newsnow”项目,它旨在为用户提供优雅的实时热点新闻阅读体验,让信息获取既便捷又高效,简直是"新闻控”的福音,地址在这里:此链接。另一个是"GenAI_Agents”项目,以12884星的高热度,为开发者提供了从基础到高级的生成式AI智能体技术教程与实现,旨在赋能构建更智能的交互式AI系统,详情可访问:此链接
  4. +
+

社媒分享

+
    +
  1. Gorden Sun在社交媒体上分享了Mirage虚拟人模型产品,这款产品简直是"数字分身”的魔法师!它能通过音频驱动,生成生动、嘴型同步且表情丰富的虚拟人视频,栩栩如生。Gorden Sun还特别强调,该产品的详细技术报告对研究人员具有极高的参考价值,看来又将引发一场虚拟人技术的"军备竞赛”。 +Link
  2. +
  3. Sam Altman在X平台发文宣布,o3产品价格已大幅下调80%,这简直是"福利大放送”!他表达了对用户创新使用的期待,并预告了o3-pro版本也将提供令人满意的定价。看来,Sora之父又在鼓励大家放开手脚,用更低的成本去探索AI的无限可能了。 +Link
  4. +
  5. Ryan ᵐᶠᵉʳ 🦄d/acc抛出了一个关于下一代创业者的深刻观点:他们不应被束缚于模仿乔布斯等前代成功模式,也不应受限于有限的低质量输入,而应忠于自我,以独特的"vibe”和玩乐精神自由探索。这就像在说,别做别人的影子,去创造属于你自己的"游戏规则”! +Link
  6. +
  7. 用户wwwgoubuli分享了AI在实际工作中的一个有趣转变。他提到,远程团队成员初时因担心被视为偷懒而不敢充分使用AI,但在他多次分享AI"正确用法”后,团队逐渐"放开手脚”,结果代码的注释、规范和质量均显著提升,同事们也展现出更高的自信。这简直是AI赋能团队效率提升的"教科书式”案例,打破了心中的"AI焦虑”。 +Link
  8. +
+

AI洞察日报 2025/6/10

+

AI产品与功能更新

+
    +
  1. +

    Google 近日调整 AI 模型使用政策,自5月起,Google AI Studio 已停止向免费用户提供 Gemini 2.5 Pro 系列模型调用权限,未来开发者需自行提供 API 密钥接入服务。此举引发了开发者社区的广泛关注,分析认为这是 Google 推动 Gemini 商业化进程、将高性能模型纳入付费体系的信号。 +
    图片

    +
  2. +
  3. +

    据官方数据显示,阿里旗下通义千问3大模型开源仅一个月,其全球累计下载量已突破1250万次,并在 Hugging Face 等主流 AI 开源平台上,衍生模型数量超过13万个,跃居全球第一。这一爆发式增长不仅代表着国产大模型的开源实力正与国际水平接轨,也进一步巩固了阿里在全球 AI 基础模型生态中的影响力。 +
    图片

    +
  4. +
  5. +

    轻量级文档解析模型 MonkeyOCR 近日震撼登场,它以仅3B参数的轻量级架构,在英文文档解析任务中展现出惊艳性能,超越了 Gemini 2.5 Pro 等重量级模型,并大幅提升了处理速度。其核心创新在于采用"结构-识别-关系”三元组范式,这不仅提升了解析准确率,还显著降低了计算资源需求,为中小型企业部署 AI 文档解析解决方案提供了可能。 +
    图片
    +论文链接:https://arxiv.org/abs/2506.05218

    +
  6. +
  7. +

    在近期一场采用2025年高考新课标Ⅰ卷客观题的数学挑战中,字节豆包腾讯元宝表现出色,以68分的成绩并列第一,充分展现了其在复杂推理场景下的潜力。此次比赛不仅揭示了各大 AI 模型在高考数学上的能力与不足,也反映出它们在细节处理、公式应用和逻辑推理方面的显著进步,为未来 AI 数学能力的发展奠定了基础。 +
    图片
    +
    图片

    +
  8. +
+

AI行业展望与社会影响

+
    +
  1. +

    架构师罗伯特・卡鲁索近日进行了一项跨时代实验,结果显示1977年推出的Atari 2600游戏机国际象棋引擎轻松击败了 OpenAIChatGPTChatGPT 在比赛中频繁犯错、混淆棋子,这引发了公众对复古科技现代 AI 棋艺水平的讨论和反思。 +
    图片

    +
  2. +
  3. +

    博主 wwwgoubuli 认为 AI 编程代理正进入平台期,尽管当前模型如 Gemini 2.5 ProClaude 表现强劲,但模型层面的"飞升”空间有限。他预计未来将有更多产品井喷式发展,而重点在于载体媒介IDE/plugin 等方面的完善,而非核心模型能力的突破。 +Link

    +
  4. +
+

开源TOP项目

+
    +
  1. +

    vosk-api 是一个拥有10342颗星的开源项目,它提供适用于 AndroidiOS树莓派和服务器的离线语音识别 API,并支持 PythonJavaC#Node 等多语言开发。 +Link

    +
  2. +
  3. +

    RAG_Techniques 是一个拥有17002颗星的开源项目,该仓库展示了检索增强生成(RAG)系统的各种先进技术。它结合了信息检索生成模型,旨在为用户提供更加准确且上下文丰富的 AI 回复。 +Link

    +
  4. +
  5. +

    Seelen-UI 是一个拥有7257颗星的开源项目,它提供了一个完全可定制桌面环境,专为 Windows 10/11 用户设计,让用户能够打造个性化的操作界面。 +Link

    +
  6. +
  7. +

    Meng Shao 分享了5个精选的开源项目,旨在帮助 AI 工程师提升技能并获得"超能力”,尤其是在 LLMs 和生成式 AI Agent 领域。这些项目涵盖了从 LLM 基础知识、AI Agent 构建、生产级机器学习应用部署到提示工程等关键学习资源。 +
    图片
    +Link

    +
  8. +
+

社媒分享

+
    +
  1. +

    博主归藏详细介绍了如何在 Liblib 平台在线使用 FLUX Kontext 工具进行图片修改,无需本地运行 Comfyui,并分享了涵盖单图、双图、三图融合及图片放大功能的工作流Liblib 上线的 Kontext 提供了便捷的在线处理能力,旨在帮助用户轻松掌握图片创作的各种高级技巧。 +
    图片
    +Link

    +
  2. +
  3. +

    Tw93 推荐了 PayQrcode 方案,该方案通过物理图片合并技术,成功将微信支付宝收款码融合为单张图片,实现了线下离线场景下的双码兼容识别。这项创新解决了传统双码不便的问题,并经本地测试证明识别效果良好,极大地提升了支付便利性。 +
    图片
    +Link

    +
  4. +
+

AI洞察日报 2025/6/9

+

AI产品与功能更新

+
    +
  1. OpenAI 宣布 ChatGPT 高级语音功能升级,显著提升了语音交互的自然性和流畅度,使其语调更自然、节奏更真实、情绪表达更丰富,并加入了双向自动翻译功能,能持续进行多轮对话翻译,无需重复指令,特别适用于国际出行、远程办公和语言学习等场景。
  2. +
  3. 面壁智能于6月6日发布了 MiniCPM 4.0系列 模型,包括8B稀疏版和0.5B轻巧版,在端侧性能上实现了极限情况下220倍、常规5倍的速度提升,通过系统级稀疏创新和高效双频换挡技术,大幅减少了端侧存储需求,并已成功适配Intel、高通等主流芯片。 +
    图片
  4. +
+

开源TOP项目

+
    +
  1. tensorzero (Link) 是一款拥有4869个Star的项目,它为LLM应用创建了一个反馈循环,旨在将生产数据转化为更智能、更快、更经济的模型。
  2. +
  3. HumanSystemOptimization (Link) 是一个拥有15170个Star的项目,提供了一份名为"健康学习到150岁”的人体系统调优指南
  4. +
  5. omni-tools (Link) 拥有2940个Star,它提供了一套自托管的网页工具集,用于日常任务,强调无广告、无跟踪,且可在浏览器中快速便捷使用。
  6. +
  7. BlackFriday-GPTs-Prompts (Link) 是一个拥有7018个Star的项目,提供了无需Plus订阅即可使用的免费GPTs列表
  8. +
+

社媒分享

+
    +
  1. ginobefun分享了关于 RAG技巧与底层代码剖析 的文章(Link),强调通过手写代码理解RAG核心逻辑,并详细介绍了语义分块上下文增强检索如何提升大模型问答质量。
  2. +
  3. 黄赟认为 AI数字人 将成为电商平台的标配(Link),并提到近期AI主播被"开发者模式”玩坏的现象,导致技术服务商需紧急修复漏洞。
  4. +
  5. 歸藏展示了 FLUX kontext 在修改汽车宣传图方面的强大能力(Link),能将汽车背景更换为黄昏沙滩或赛道,并智能地为行驶中的车轮添加运动模糊效果。 +
    图片
    +
    图片
  6. +
  7. izx-copy分享了Google的建议(Link),鼓励开发者直接使用其高质量的深度研究代码库,而非自行开发,认为其比"vibe coding”版本更优。 +
    图片
  8. +
  9. Yangyi呼吁开发 "睿智的AI” (Link),即能够快速识别幻觉和虚假信息的AI,并提出了AI幻觉专家网络的概念,认为这能帮助AI自主辨别信息真伪,提升输出可靠性。
  10. +
  11. pimgeek转发了一篇关于公司用ChatGPT替代客服导致翻车的文章(Link),文章指出用户更倾向于与真人客服沟通,数据显示多数用户不希望产品引入AI客服,甚至会因此考虑更换竞争对手。 +
    图片
  12. +
+

AI洞察日报 2025/6/8

+

AI产品与功能更新

+
    +
  1. 阿里巴巴于6月6日正式开源了全新的千问3向量模型系列Qwen3-Embedding,其在文本检索、聚类和分类等任务上的性能提升超40%,并超越谷歌和OpenAI的顶尖模型,获得了同类模型的最佳性能(SOTA),同时具备强大的多语言支持能力。
    图片
    该系列共9款模型,已在魔搭社区、Hugging Face和GitHub等平台开源,并可通过阿里云百炼使用API服务,为全球开发者提供了更高效的AI应用空间。
  2. +
  3. AI驱动的本地视频编辑工具Diffusion Studio Pro正式亮相,该产品被誉为"CapCut + Cursor”结合,以本地优先、浏览器为基础的非线性编辑体验,集成了超过16种生成式AI模型,旨在降低创作门槛并大幅提升专业视频创作者的工作效率。其提供免费无限层级,有望成为AI驱动视频编辑的行业标杆,为创作者带来更高效、直观的创作体验。
  4. +
  5. 谷歌于6月5日发布了名为Portraits的创新AI产品,用户可通过与虚拟专家进行实时对话,获得个性化的沟通技巧与领导力学习体验,首批虚拟专家基于知名畅销书作者打造。
    图片
    该产品依托谷歌先进的生成式AI技术,强调交互性和实践性,目前仅对美国IP用户开放测试,预示着AI教育将迈向更互动、更个性化的新阶段。
  6. +
+

AI前沿研究

+
    +
  1. 在第七届"北京智源大会”上,智源研究院重磅推出了一系列名为"悟界”的大模型,其中包括原生多模态世界模型Emu3、脑科学多模态通用基础模型见微Brainμ,以及具身智能的协作框架RoboOS2.0RoboBrain2.0等。
    图片
    这些模型旨在推动人工智能在医疗、教育、环境监测等多个重要领域的应用落地,展现了智源研究院在多模态智能技术方面的雄心和实力。
  2. +
+

开源TOP项目

+
    +
  1. react-bits是一个拥有12729星的开源React组件集合,它提供动画、交互式且完全可定制的组件,旨在帮助开发者构建出令人惊叹且难以忘怀的用户界面。项目地址:Link
  2. +
  3. art-design-pro是一个拥有1729星的Vue 3管理后台模板,它采用Vite + TypeScript + Element Plus构建,专注于优化用户体验和视觉设计。项目地址:Link
  4. +
+

社媒分享

+
    +
  1. 刘勿锋分享了用Claude画图时的一个实用小技巧:通过简单的提示词,可以指导Claude调用如iconfontLucied React图标库等第三方图标库,而非使用系统默认的emoji,从而大幅提升前端网页的视觉美观度和风格统一性。
    图片

    图片
    更多详情请访问:Link
  2. +
  3. wwwgoubuli预估接下来社交媒体上将出现两种热门内容:一部分是深入分析作文题目的讨论,另一部分则是围绕AI写作文展开的创作比拼,展现了对当前AI应用趋势的敏锐观察。更多信息:Link
  4. +
+

AI洞察日报 2025/6/7

+

AI产品与功能更新

+
    +
  1. 近日,德国科技巨头博世阿里云合作,将通义大模型应用于智能座舱,通过云计算与端侧混合计算实现与3D 数字人的交互,提升座舱智能感知和多模态控制能力。该方案支持知识问答和同声传译,使智能座舱成为理解并满足用户需求的智能助手,标志着汽车行业正迈向个性化、智能化的移动空间。
  2. +
  3. Perplexity AI近日推出SEC文件访问功能,旨在帮助各类投资者在Perplexity 平台轻松查询和理解复杂的财务文档,所有答案均附有引用。此外,Perplexity还推出了"实验室”功能,该功能能够将用户的提示转化为报告、仪表板等完整项目,显著提升了工作流效率。
  4. +
  5. Trae 平台近日更新,正式集成GoogleGemini 2.5 Pro Preview模型,该模型在WebDev ArenaLMArena 编码排行榜中均位列第一,显著提升了前端开发与UI 设计能力。
    图片
    此次升级优化了代码转换、编辑及复杂代理工作流,并已免费向用户开放,有望推动AI区块链去中心化应用领域的创新。
  6. +
  7. 海外知名的AI 视频生成平台 PixVerse正式推出其国内版"拍我AI”,同步上线移动端 App 和网页版,旨在为国内内容创作者和企业提供高效便捷的AI 视频生成工具
    图片
    "拍我AI”支持通过文本或图像一键生成高质量、多风格视频,依托 PixVerse V4.5 算法并进行了本地化优化,有望推动中国市场AI 视频技术的普及和应用。
  8. +
  9. ElevenLabs于2025年6月5日发布了被誉为"地表最强”的文本转语音(TTS)模型Eleven v3 (Alpha 版),该模型不仅能将文本转化为自然流畅的语音,还能通过音频标签精确控制情感、语速甚至加入音效,实现"演技合成”。
    图片
    图片
    它支持70多种语言多角色自然对话,并通过自动标签功能简化创作,有望在影视配音虚拟助手等领域广泛应用,重新定义AI 语音的未来。
  10. +
+

AI前沿研究

+
    +
  1. 这篇研究论文介绍了一种名为动态内存稀疏化(DMS)的新方法,它通过压缩Transformer LLMKV 缓存,在推理时实现超扩展,从而在相同计算资源下生成更多 Token 并提高模型准确性。该方法仅需少量训练步骤即可实现高压缩率,并显著提升了如Qwen-R1 32B等多种LLMAIME 24GPQALiveCodeBench等基准测试上的准确性。论文地址:https://arxiv.org/abs/2506.05345
  2. +
+

AI行业展望与社会影响

+
    +
  1. 宇树科技 CEO 王兴兴在第七届北京智源大会上表示,公司始终坚持的终极目标是让机器人实现家庭和工业场景的实用化工作,而跳舞和格斗等具身智能展示仅是训练和技术验证的手段。
    图片
    他透露,今年上半年人形机器人在商业租赁市场已初具规模并带来可观价值,未来将加速机器人实用化落地。
  2. +
  3. 知名科技博主王自如B站宣布复更,并正式更名为"王自如AI”,表示将以AI 测评 UP 主的身份开启二次创业,专注于AI 内容创业AI 应用,助力传统产业数字化转型。
    图片
    他在视频中感谢了董明珠雷军的鼓励和帮助,并提及此前入职格力是为重塑销售体系。
  4. +
+

开源TOP项目

+
    +
  1. note-gen是一款AI 赋能的跨平台Markdown 笔记应用(Stars: 3161),致力于利用AI将碎片化知识整理成可读笔记,连接记录与写作。项目地址:https://github.com/codexu/note-gen
  2. +
  3. notebooks项目(Stars: 1174)提供了通过Google ColabKaggle等平台引导式Notebook免费微调大型语言模型的功能。项目地址:https://github.com/unslothai/notebooks
  4. +
  5. ragbits(Stars: 749)提供了一系列构建模块,旨在帮助开发者快速开发生成式 AI 应用程序。项目地址:https://github.com/deepsense-ai/ragbits
  6. +
+

社媒分享

+
    +
  1. 知名博主歸藏推荐即梦AI图片3.0的智能参考功能,该功能支持用户基于上传图像生成任何内容,并能修改照片背景、添加配饰、更改姿势,甚至精确添加或修改复杂文字效果
    Image
    这一突破性能力极大地提升了日常照片分享的表现力,并能高效生成电商产品图、小红书和视频封面等营销物料。文章链接:https://mp.weixin.qq.com/s/_kt9OLylR95sG7U37wseSw,社交媒体链接:https://m.okjike.com/originalPosts/6842cd91a26304532600fa4d
  2. +
  3. Yangyi分享了AI 时代的产品价值公式,指出产品价值取决于"新体验”(获得有效结果与美观度)和"迁移成本”(旧平台数据沉没成本与上手门槛)之间的差异。因此,构建高价值AI 产品需要提供超预期的有效结果、足够美观的界面,并致力于降低用户数据迁移的难度和产品的使用门槛。社交媒体链接:https://x.com/Yangyixxxx/status/1930912029809979654
  4. +
+

AI洞察日报 2025/6/6

+

AI产品与功能更新

+
    +
  1. Pollo AI 推出了一站式AI图像与视频生成平台,整合全球前沿模型如Google Veo 3、Kling等,提供文字转视频、图像风格化、角色一致性等多种功能,并支持API接入,相比同类平台更具成本和模型优势,且获得Google Cloud的Veo 3模型授权。 +
    图片
  2. +
  3. Luma Labs 发布了全新的AI视频编辑工具 Modify Video,基于其Dream Machine平台和Ray2模型,用户能通过文本提示对视频进行风格重塑、场景替换和角色调整,大幅降低了传统视频制作的复杂性和成本。该工具凭借Ray2模型的强大能力,在动作流畅性和时间一致性方面表现出色,并降低了创意门槛。 +
    图片
  4. +
  5. 谷歌更新了Gemini 2.5版本,显著提升了AI音频对话与生成技术,使其成为一个能够原生理解和生成文本、图像、音频、视频和代码的多模态AI系统。新功能使得人机交流更加自然流畅,支持实时音频对话、风格控制和多语言,并通过可控的文本转语音技术,允许用户精确调整语音输出的语调和情感。 +
    图片
  6. +
  7. 热门手游《逆水寒》与可灵AI合作,在游戏内推出了全新的"图生动图”玩法,让玩家能够通过简单操作将静态图片转化为个性化动态画面。该功能支持用户截图或上传图片,通过输入描述词来生成动图,并可进行双人互动创作,提升了玩家的游戏体验。 +
    图片
  8. +
+

AI前沿研究

+
    +
  1. NVIDIA 发布了Llama-3.1-Nemotron-Nano-VL-8B-V1,这是一款基于Llama-3.1架构的8B参数视觉语言模型,支持图像、视频和文本输入,并能输出高质量文本及具备强大的图像推理能力。该模型在OCR和文档智能方面表现卓越,通过AWQ4bit量化技术可在单张RTX GPU上高效部署,并已在Hugging Face平台开源,为开发者提供了轻量高效的多模态AI解决方案。 +
    图片
  2. +
  3. Voyager 是一种新颖的视频扩散框架,它能从单张图片和用户定义的摄像机路径,生成世界一致的3D点云序列,特别适用于游戏和虚拟现实中可探索的3D场景。这项技术通过联合生成对齐的RGB和深度视频序列,实现了帧间固有的3D一致性,显著提升了视觉质量和几何精度。论文地址:https://arxiv.org/abs/2506.04225
  4. +
+

AI行业展望与社会影响

+
    +
  1. 硅谷投资人Mary Meeker的最新AI报告指出,全球AI竞争格局正经历深刻重塑,中国AI力量与开源浪潮正全面崛起,挑战OpenAI等头部公司的主导地位。报告强调,中国AI模型性能已逼近国际一线,并在制造业中展现出强大的产业融合能力,同时开源模型凭借低成本和高灵活性,市场份额迅速增长,预示着AI行业进入多极对抗新时代。 +
    图片
  2. +
+

开源TOP项目

+
    +
  1. netbird 是一个拥有 14029 颗星的开源项目,它基于 WireGuard® 帮助用户将设备连接到安全的覆盖网络,并支持SSOMFA和精细的访问控制,提供安全高效的网络连接。项目地址:https://github.com/netbirdio/netbird
  2. +
  3. quarkdown 是一个拥有 3952 颗星的开源项目,旨在为 Markdown 文本赋予"超能力”,将想法轻松转化为演示文稿、文章和书籍等多种形式。项目地址:https://github.com/iamgio/quarkdown
  4. +
  5. cognee 是一个拥有 2658 颗星的开源项目,其核心功能是仅用 5 行代码即可实现 AI 智能体的记忆,极大简化了智能体开发中的复杂性。项目地址:https://github.com/topoteretes/cognee
  6. +
+

社媒分享

+
    +
  1. @wwwyesterday 分享了一个关于与 AI 对话的"生活小妙招”,即在开始时让AI每次回复都称呼"哥哥”,一旦AI停止这样称呼,就意味着可以新开对话窗口了。这个小技巧巧妙地利用了AI的"记忆”机制,为用户提供了判断对话是否需要重新开始的依据。
  2. +
  3. Gorden Sun 宣布 Fish Audio 已开源其 S1-mini语音模型,作为表现良好的S1模型的精简版(0.5B参数)。S1-mini可供个人免费部署使用,但不可商用。在线体验及模型链接:https://huggingface.co/spaces/fishaudio/openaudio-s1-mini https://huggingface.co/fishaudio/openaudio-s1-mini
  4. +
+

AI洞察日报 2025/6/5

+

AI产品与功能更新

+
    +
  1. Suno 近日升级了其AI音乐编辑工具,允许用户上传和混音未完成的作品,并能修改歌词和延长曲目时长至八分钟,同时引入了创意滑块等功能。
    图片
    此次升级正值其面临主要唱片公司的版权诉讼,唱片公司希望引入类似于 YouTube Content ID 的技术来追踪 AI 平台上的音乐使用情况。
  2. +
  3. OpenAI 近日宣布 ChatGPT 升级新功能,现可连接 OutlookTeamsGmail 等多个外部服务,旨在提升企业用户的协作和信息获取效率。
    图片
    此外,macOSChatGPT Team 用户还新增了"录制模式”,能自动生成会议记录和待办事项。
  4. +
  5. AI驱动的代码编辑器 Cursor 于近日正式发布1.0版本,引入了核心功能 BugBot,能自动化审查 GitHub 上的 Pull Request 并一键修复代码。
    图片
    该版本还全面开放了后台代理功能,并增加了 Jupyter 支持和"Memories”项目管理功能,旨在显著提升开发者的生产力。
  6. +
  7. 腾讯公益近日推出了创新性的"问 AI”功能,首次将大型人工智能模型应用于公益领域,旨在提升公众与公益项目及机构之间的互动和透明度。
    图片
    这一便捷的沟通方式有助于公众更深入地理解并参与公益事业,并有望推动公益事业的进一步发展。
  8. +
+

AI前沿研究

+
    +
  1. 这项研究提出 SuperWriter-Agent 框架,通过引入结构化的思考、规划和完善阶段,显著提升了大型语言模型在生成长文本时的连贯性和质量。
    基于此框架训练的 SuperWriter-LM 在多项基准测试中表现出领先水平,证明了这种反思驱动方法能够让模型像专业作家一样,生成更高质量和一致性的长篇内容:Link
  2. +
+

AI行业展望与社会影响

+
    +
  1. OpenAI 首席执行官 山姆・奥尔特曼 指出,AI 正逐渐被企业视为基层员工,导致科技公司初级职位招聘量在2023至2024年间下降了25%。
    图片
    专家预测,到2030年 AI 可能取代多达3.75亿个工作岗位,甚至未来1到5年内可能淘汰一半的初级白领岗位,引发高达20%的失业率。
  2. +
+

开源TOP项目

+
    +
  1. HowToCook 是一个专为程序员设计的居家烹饪方法指南,旨在解决程序员做饭难的问题。该项目目前已获得 87530Star,内容仅限简体中文,提供详细的烹饪指导:Link
  2. +
  3. system-design-primer 是一项旨在帮助学习如何设计大规模系统并准备系统设计面试的开源项目,已获得 304096Star。它提供了全面的学习资源,并包含 Anki 抽认卡辅助学习:Link
  4. +
  5. ChinaTextbook 项目致力于收集中国所有小学、初中、高中及大学的 PDF教材,为学生和教师提供免费的教育资源。这个实用的资料库已获得 35875StarLink
  6. +
  7. Firecrawl 近日发布了突破性的 /search API,允许开发者通过一次API调用实现网页搜索与内容抓取,并以 AI友好 的多种格式输出数据。
    图片
    这一功能极大简化了 AI 应用的数据获取流程,无需第三方依赖,提升了数据处理效率,并在 GitHub 上已获得超过10K的 Star
  8. +
+

社媒分享

+
    +
  1. Gorden Sun 分享了一套能生成"超级赞”图文效果的 AI 提示词,并推荐使用 GPT4oClaude-3.7DeepSeek-V3 等工具。
    Image
    他指出,这些提示词虽然易于使用,但原作者在整理上花费了心思:Link
  2. +
  3. 推主 wwwyesterday 将现代学术论文比作 npm 包管理系统,认为两者都存在论文/包数量庞大、引用/依赖层层叠叠的现象,且大部分价值不高,少数经典广为引用。
    他指出,现在很少有人能完全从零开始原创,就像写东西离不开 package.json,但他仍会刷 arxiv 寻找新观点:Link
  4. +
+

AI洞察日报 2025年6月4日

+

AI产品与功能更新

+
    +
  1. Komiko平台近日推出视频到视频功能,利用AI技术将用户上传的视频一键转换为动漫、漫画等多样化艺术风格的动态内容,极大降低了动画创作的门槛。该功能通过深度整合先进AI模型,并提供AI线稿上色、动画补帧等工具,旨在加速创意产业的数字化转型,成为专业人士和爱好者的首选创作工具。 +
    图片
  2. +
  3. 蚂蚁集团的**"AI健康管家”成功通过信通院医疗健康行业大模型可信评估**,成为首批获认可的产品之一,进一步提升了其在医疗AI领域的可靠性。该产品已服务超4000万用户,提供预约医生、健康评估、报告解读等智能健康服务,并吸引了60多位知名医生AI智能体入驻,未来将持续扩展功能。 +
    图片
  4. +
+

AI前沿研究

+
    +
  1. AI"教父”约书亚・本吉奥成立非营利组织LawZero,投入3000万美元启动资金,旨在开发**"科学家 AI”系统以防范未来AI智能体对人类进行欺骗。该系统将作为AI安全监控的护栏**,确保自身智能程度与所监管AI智能体相当,通过提高AI的透明性和可信性,推动行业向更负责任的方向发展。 +
    图片
  2. +
  3. Play AI开源发布了PlayDiffusion,一款基于扩散模型的语音**"局部修改”工具,能够实现对音频片段的替换、删除或调整而不留痕迹**,极大提升了音频编辑效率和自然度。该技术能以高达50倍的速度提升TTS推理效率,并保持全局一致性,对播客制作、AI配音和内容纠错等场景具有重要意义,有望成为内容创作的必备利器。 +GitHub: PlayDiffusion 模型下载: PlayDiffusion
  4. +
  5. LumosFlow是一个用于长视频生成的新框架,它通过引入运动引导来解决现有方法中时间连贯性不足和过渡不自然的问题。该研究通过分层生成关键帧并分解中间帧插值,实现了高达15倍的插值,确保了生成视频的运动和外观一致性。 +论文URL: LumosFlow
  6. +
+

AI行业展望与社会影响

+
    +
  1. OpenAI以30亿美元收购Windsurf后,用户对其Claude模型访问权限大幅受限,引发开发者普遍不满,严重影响了开发效率与用户体验。此举导致Windsurf用户面临成本增加和操作复杂性,且未能获得Claude4系列直接访问,这可能威胁Windsurf在激烈市场竞争中的未来增长。 +
    图片
  2. +
+

开源TOP项目

+
    +
  1. RedditVideoMakerBot (⭐7672) 是一个开源项目,旨在通过一条命令简化Reddit视频的创建过程,极大地降低了用户制作视频的门槛。 +项目URL: RedditVideoMakerBot
  2. +
  3. cursor-free-vip (⭐28687) 是一款专为Cursor AI设计的工具,能够自动重置机器ID,从而免费升级并绕过其Pro功能中的高代币限制和试用请求限制。该项目有效解决了用户在Cursor AI使用过程中遇到的免费试用账户限制问题。 +项目URL: cursor-free-vip
  4. +
+

科技博主观点

+
    +
  1. 科技博主大帅老猿指出,通过重新讲述学到的知识并录制视频来卖课是常见操作,但标榜原创的行为只可能欺骗新手。他强调检验原创的唯一真理举报、投诉、打官司,只有能让侵权内容下架或获得赔偿,才有资格自称原创。 +Tweet Link
  2. +
  3. 博主ginobefun推荐了一篇关于复杂RAG架构演进的InfoQ文章,该文章深入探讨了跨模态知识联邦统一语义推理的实践。文章提出通过融合知识库统一知识图谱解决传统RAG在处理异构、多模态知识时的挑战,并通过医疗和金融案例展示了其应用价值。 +
    图片

    图片

    图片
    文章链接:文章
  4. +
+

AI洞察日报 2025年6月3日

+

AI产品与功能更新

+
    +
  1. 谷歌近日在美国地区推出了 Gemini Live 功能,正式登陆 iOSiPadOS 平台,用户可通过 Gemini App 免费体验 AI 识别场景和屏幕内容的便捷。这项创新不仅提升了用户互动体验,也预示着 AI 技术正进一步融入日常生活,成为人们的智能助手。
    图片
  2. +
  3. 微软最新推出了免费的 Bing Video Creator 工具,基于 OpenAI Sora 技术,让用户通过简单的文字提示即可轻松创作短视频。这款工具已在全球范围内的必应移动应用中上线,极大降低了视频创作的门槛,有望丰富用户的创作体验。
    图片
  4. +
  5. 新加坡国立大学(NUS)团队近日发布了 OmniConsistency 项目,它以极低成本复现了 GPT-4o 在图像风格化上的一致性,解决了开源社区的风格化难题。该项目通过独特的学习框架和模块化架构,有望成为图像生成领域的重要工具,推动 AI 艺术创作。
    图片
  6. +
+

AI前沿研究

+
    +
  1. WebChoreArena (Link) 提出了一个包含 532 项精心策划任务的全新基准,旨在评估 LLM 驱动的网页浏览代理处理繁琐复杂网页任务的能力。研究发现,尽管 GPT-4o 等先进大模型在此基准上表现出显著进步,但相较于通用网页任务,仍有巨大的提升空间,凸显了处理复杂**"网络杂务”**的挑战性。
  2. +
  3. RoboMaster (Link) 提出了一种创新的机器人操作视频生成框架,它通过协作轨迹建模和阶段性分解交互过程,有效解决了多目标交互中视觉保真度下降的问题。这项技术成功地实现了机器人操作中视频生成质量的新突破,为复杂场景下的轨迹控制提供了更精准的解决方案。
  4. +
+

AI行业展望与社会影响

+
    +
  1. 近日,美国犹他州律师理查德・贝德纳因在法庭文件中引用 ChatGPT 生成的虚假案例,被法院处以罚款,再次引发了对 AI 在法律领域应用的广泛争议。此事件深刻提醒法律从业者,在使用新兴技术时,务必保持严谨的审核责任,确保法律文件的准确性。
    图片
  2. +
  3. OpenAI 计划在2025年上半年将 ChatGPT 打造为具备 T 型技能 的"超级助手”,旨在挑战苹果 Siri 的市场地位。这份战略文件透露,OpenAI 不仅希望 ChatGPT 成为能处理日常琐事和复杂任务的智能伙伴,更呼吁用户能在所有平台上自由选择默认 AI 助手,推动 AI 市场更加开放。
  4. +
+

开源TOP项目

+
    +
  1. nautilus_trader (Link) 是一个拥有 6728 Star高性能算法交易平台事件驱动回测器,为开发者提供强大的交易策略验证能力。
  2. +
  3. data-engineer-handbook (Link) 拥有 28669 Star,是一个旨在帮助用户学习数据工程的综合性资源仓库,汇集了所有相关学习链接。
  4. +
  5. postiz-app (Link) 是一个坐拥 20460 Star终极社交媒体日程安排工具,集成了大量 AI 功能,旨在简化社交媒体管理。
  6. +
+

AI洞察日报 2025年6月2日

+

AI产品与功能更新

+
    +
  1. Runway公司最新推出的Gen-4References功能已支持移动设备,使用户能通过手机照片结合自然语言提示,快速生成风格一致的艺术作品。这项功能将AI生成技术与移动便捷性完美结合,大幅降低了AI创作门槛,为内容创作者和普通用户带来了无限可能。 +
    图片
  2. +
  3. Anthropic近期宣布,其旗舰模型Claude已新增功能,支持开发者构建能与Claude直接对话的AI应用程序,这与AI Studio的开发理念高度契合。此举不仅降低了AI应用开发门槛,为开发者提供了更广阔的创新空间,也预示着AI应用普及与落地将进一步加速。 +
    图片
  4. +
+

AI前沿研究

+
    +
  1. 华为近期通过其"昇腾 + Pangu Ultra MoE”系统展示了一项惊人突破:一个近万亿参数的MoE大模型,在不使用GPU的情况下,仅需2秒便能解答一道高等数学题。这不仅彰显了华为在自主可控国产算力与模型训练方面的强大实力,也为未来大规模AI模型的训练与应用开辟了新可能。 +
    图片
  2. +
  3. 这篇论文通过构建一个英语回文谜题基准测试,揭示了当前视觉-语言模型VLM)在理解和解决这类谜题时遇到的显著困难。尽管VLM在解码简单视觉线索方面表现出一定能力,但对于需要抽象推理横向思维及理解视觉隐喻的任务,它们仍旧力不从心,表明多模态抽象是其面临的独特挑战。详情请见:Link
  4. +
  5. LoRAShop是一个创新的多概念图像编辑框架,它利用修正流Transformer的特性,实现了在不重新训练模型的情况下,将多个主题或风格无缝融入原始场景。这项技术通过智能融合LoRA权重,不仅保留了图像的整体背景和细节,还在身份保持上超越了现有基线,为个性化图像生成编辑带来了革命性的"Photoshop式”体验。详情请见:Link
  6. +
  7. DeepTheorem是一个利用自然语言强化学习RL-Zero)来增强大型语言模型LLM)数学推理能力的非正式定理证明框架。该框架通过一个大规模高质量数据集和创新策略,显著提升了LLM在IMO级别非正式定理证明中的表现,展现了其在数学探索和自动化证明领域的巨大潜力。详情请见:Link
  8. +
+

AI行业展望与社会影响

+
    +
  1. 根据阿姆斯特丹自由大学环境研究所博士生Alex de Vries-Gao的分析,人工智能的电力消耗预计将在2025年底前接近全球数据中心总电力消耗的一半,这意味着其能耗将很快超越比特币挖矿。尽管技术效率有所提升,但AI的电力需求仍在快速增长,凸显了在能耗与可持续发展之间寻找平衡的重要性。 +
    图片
  2. +
  3. 近期,黑客通过伪装成阿里云AI SDK的恶意软件包,成功实施了供应链攻击,利用隐藏在Pickle格式ML模型中的恶意代码窃取用户敏感信息。这揭示了AI安全供应链面临的新挑战,传统安全工具在检测恶意ML模型方面的不足,以及开发者面临的潜在风险。 +
    图片
  4. +
+

开源TOP项目

+
    +
  1. courses是一个由Anthropic提供的教育课程项目,旨在帮助用户学习相关知识。该项目在GitHub上拥有13483颗星,可访问其GitHub页面:Link
  2. +
  3. agent-zero是一个提供AI框架功能的项目,旨在帮助开发者构建AI应用。该项目在GitHub上获得了7360颗星,详情可前往:Link
  4. +
  5. cobalt是一个致力于"保存你所喜爱事物的最佳方式”的项目,为用户提供高效的收藏管理功能。该项目在GitHub上备受欢迎,拥有32941颗星,可通过Link查看详情。
  6. +
  7. the-book-of-secret-knowledge是一个内容丰富的知识集合项目,汇集了鼓舞人心的列表、手册、备忘单及各类工具。该项目在GitHub上拥有高达171992颗星,是寻求实用信息和技巧的宝库,访问地址为:Link
  8. +
+

AI洞察日报 2025年6月1日

+
    +
  1. 近日,通义实验室自然语言智能团队发布并开源VRAG-RL——一款视觉感知多模态RAG推理框架,旨在解决AI从图像、表格等视觉语言中检索关键信息并进行精细化推理的难题,其强化学习和创新的视觉感知机制显著提升了对视觉信息的理解和检索效率。该框架在多个基准数据集上表现出色,未来有望提升模型在不同视觉任务中的泛化能力,请查阅跳转链接了解更多。
  2. +
  3. 亚利桑那州立大学研究小组发布论文指出,大语言模型并非进行真正推理,而仅仅是在寻找数据间的相关性,这可能导致公众对其工作机制产生误解。该研究强调,在日益依赖AI的时代,我们需更谨慎看待技术能力,未来AI研究有望朝着更具解释性的方向发展。
  4. +
  5. Perplexity AI正式推出Perplexity Labs,为Pro订阅用户带来多工具协同的全新AI生产力工具,能将复杂项目开发流程简化至数分钟,旨在提供从创意到成果的全链条支持。这一功能通过深度网络浏览、代码执行等核心能力,标志着Perplexity从答案引擎向综合性AI生产平台转型
  6. +
  7. 夸克近日上线“深度研究”功能,该功能依托通义千问大模型,能围绕学术课题、行业分析等复杂议题,自动完成从资料搜集到报告生成的全流程研究。此举标志着AI正从信息检索工具内容创作伙伴进一步跃迁,为科研调研、市场洞察等场景提供高效支持
  8. +
  9. 阿里云正式发布通义灵码 AI IDE,这是一款原生的人工智能开发环境,凭借强大的编程智能体模式长期记忆行间建议预测功能,显著提升开发者编程效率。该产品已免费开放下载,并且其插件累计生成超30亿行代码,成为广受欢迎的编程辅助工具,为企业开发工作提供强力支持
  10. +
  11. Memvid是一款创新AI记忆工具,通过将文本数据编码为MP4视频,实现了亚秒级快速语义搜索,大幅节省存储空间并支持离线使用。它内置聊天功能,支持PDF文档导入,为高效知识管理学术研究等领域提供了革命性的全新可能,请查阅跳转链接了解更多。
  12. +
  13. Anthropic首席执行官达里奥・阿莫代伊警告称,AI可能在未来五年内取代一半入门级白领工作,导致失业率飙升至10%-20%,并加剧经济不平等。他呼吁提高公众对AI发展的认知AI素养,以便人们适应未来职业环境,并强调政策制定者需思考超智能经济下的解决方案
  14. +
  15. AI初创公司Manus重磅发布Manus Slides功能,用户仅需一个提示词即可一键生成专业幻灯片,涵盖商务会议、教育课程等多种场景,大幅提升演示文稿创作效率。该功能凭借智能生成灵活编辑能力,支持导出PowerPoint或PDF,标志着AI代理正从任务自动化向生产力工具进一步演进。
  16. +
  17. 在GitHub上拥有7086颗星prompt-eng-interactive-tutorial,是Anthropic公司交互式提示工程教程的开源项目,旨在帮助用户有趣且有效地学习提示工程,具体请访问跳转链接
  18. +
  19. 获得10143颗星onlook项目,是一个开源可视化氛围编码编辑器,它利用AI帮助设计师或开发者可视化构建美化和编辑React应用。这款工具就像是设计师的光标,让React开发变得更直观高效,具体请访问跳转链接
  20. +
  21. 拥有12755颗星anthropic-cookbook项目,是Anthropic公司展示如何有趣且有效地使用Claude笔记本/秘籍集合。它为用户提供了多样化的Claude使用方法,是学习和应用Claude的便捷跳转链接
  22. +
  23. MMSI-Bench是一个针对多图像空间智能VQA基准测试,研究发现,尽管多模态大语言模型(MLLMs)已取得进展,但在多图像空间推理方面,其准确率(30-40%)与人类(97%)之间存在巨大差距。该研究诊断了模型四种主要的失败模式,为未来提升多图像空间智能提供了宝贵见解,论文详情请见跳转链接
  24. +
  25. ZeroGUI是一个创新的在线学习框架,它以零人力成本自动化GUI智能体训练,通过基于VLM的自动任务生成和奖励评估,克服了传统GUI学习对人工标注的重度依赖。实验证明,该框架显著提升了GUI智能体在不同环境下的性能,为自动化GUI操作带来了高效解决方案,论文详情请见跳转链接
  26. +
  27. ATLAS是一个针对Transformer架构设计的高容量长期记忆模块,它通过优化记忆上下文来克服现有模型在长序列理解上的局限,从而在测试时学习最优的记忆策略。实验结果表明,ATLAS在语言建模和长上下文理解等任务中表现优于Transformer和线性循环模型,显著提升了性能,论文详情请见跳转链接
  28. +
+ +
+ + +
+
+ + + +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/today/book/searcher.js b/today/book/searcher.js new file mode 100644 index 0000000..fc65604 --- /dev/null +++ b/today/book/searcher.js @@ -0,0 +1,529 @@ +'use strict'; + +/* global Mark, elasticlunr, path_to_root */ + +window.search = window.search || {}; +(function search() { + // Search functionality + // + // You can use !hasFocus() to prevent keyhandling in your key + // event handlers while the user is typing their search. + + if (!Mark || !elasticlunr) { + return; + } + + // eslint-disable-next-line max-len + // IE 11 Compatibility from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith + if (!String.prototype.startsWith) { + String.prototype.startsWith = function(search, pos) { + return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search; + }; + } + + const search_wrap = document.getElementById('search-wrapper'), + searchbar = document.getElementById('searchbar'), + searchresults = document.getElementById('searchresults'), + searchresults_outer = document.getElementById('searchresults-outer'), + searchresults_header = document.getElementById('searchresults-header'), + searchicon = document.getElementById('search-toggle'), + content = document.getElementById('content'), + + // SVG text elements don't render if inside a tag. + mark_exclude = ['text'], + marker = new Mark(content), + URL_SEARCH_PARAM = 'search', + URL_MARK_PARAM = 'highlight'; + + let current_searchterm = '', + doc_urls = [], + search_options = { + bool: 'AND', + expand: true, + fields: { + title: {boost: 1}, + body: {boost: 1}, + breadcrumbs: {boost: 0}, + }, + }, + searchindex = null, + results_options = { + teaser_word_count: 30, + limit_results: 30, + }, + teaser_count = 0; + + function hasFocus() { + return searchbar === document.activeElement; + } + + function removeChildren(elem) { + while (elem.firstChild) { + elem.removeChild(elem.firstChild); + } + } + + // Helper to parse a url into its building blocks. + function parseURL(url) { + const a = document.createElement('a'); + a.href = url; + return { + source: url, + protocol: a.protocol.replace(':', ''), + host: a.hostname, + port: a.port, + params: (function() { + const ret = {}; + const seg = a.search.replace(/^\?/, '').split('&'); + for (const part of seg) { + if (!part) { + continue; + } + const s = part.split('='); + ret[s[0]] = s[1]; + } + return ret; + })(), + file: (a.pathname.match(/\/([^/?#]+)$/i) || ['', ''])[1], + hash: a.hash.replace('#', ''), + path: a.pathname.replace(/^([^/])/, '/$1'), + }; + } + + // Helper to recreate a url string from its building blocks. + function renderURL(urlobject) { + let url = urlobject.protocol + '://' + urlobject.host; + if (urlobject.port !== '') { + url += ':' + urlobject.port; + } + url += urlobject.path; + let joiner = '?'; + for (const prop in urlobject.params) { + if (Object.prototype.hasOwnProperty.call(urlobject.params, prop)) { + url += joiner + prop + '=' + urlobject.params[prop]; + joiner = '&'; + } + } + if (urlobject.hash !== '') { + url += '#' + urlobject.hash; + } + return url; + } + + // Helper to escape html special chars for displaying the teasers + const escapeHTML = (function() { + const MAP = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + }; + const repl = function(c) { + return MAP[c]; + }; + return function(s) { + return s.replace(/[&<>'"]/g, repl); + }; + })(); + + function formatSearchMetric(count, searchterm) { + if (count === 1) { + return count + ' search result for \'' + searchterm + '\':'; + } else if (count === 0) { + return 'No search results for \'' + searchterm + '\'.'; + } else { + return count + ' search results for \'' + searchterm + '\':'; + } + } + + function formatSearchResult(result, searchterms) { + const teaser = makeTeaser(escapeHTML(result.doc.body), searchterms); + teaser_count++; + + // The ?URL_MARK_PARAM= parameter belongs inbetween the page and the #heading-anchor + const url = doc_urls[result.ref].split('#'); + if (url.length === 1) { // no anchor found + url.push(''); + } + + // encodeURIComponent escapes all chars that could allow an XSS except + // for '. Due to that we also manually replace ' with its url-encoded + // representation (%27). + const encoded_search = encodeURIComponent(searchterms.join(' ')).replace(/'/g, '%27'); + + return '' + + result.doc.breadcrumbs + '' + '' + teaser + ''; + } + + function makeTeaser(body, searchterms) { + // The strategy is as follows: + // First, assign a value to each word in the document: + // Words that correspond to search terms (stemmer aware): 40 + // Normal words: 2 + // First word in a sentence: 8 + // Then use a sliding window with a constant number of words and count the + // sum of the values of the words within the window. Then use the window that got the + // maximum sum. If there are multiple maximas, then get the last one. + // Enclose the terms in . + const stemmed_searchterms = searchterms.map(function(w) { + return elasticlunr.stemmer(w.toLowerCase()); + }); + const searchterm_weight = 40; + const weighted = []; // contains elements of ["word", weight, index_in_document] + // split in sentences, then words + const sentences = body.toLowerCase().split('. '); + let index = 0; + let value = 0; + let searchterm_found = false; + for (const sentenceindex in sentences) { + const words = sentences[sentenceindex].split(' '); + value = 8; + for (const wordindex in words) { + const word = words[wordindex]; + if (word.length > 0) { + for (const searchtermindex in stemmed_searchterms) { + if (elasticlunr.stemmer(word).startsWith( + stemmed_searchterms[searchtermindex]) + ) { + value = searchterm_weight; + searchterm_found = true; + } + } + weighted.push([word, value, index]); + value = 2; + } + index += word.length; + index += 1; // ' ' or '.' if last word in sentence + } + index += 1; // because we split at a two-char boundary '. ' + } + + if (weighted.length === 0) { + return body; + } + + const window_weight = []; + const window_size = Math.min(weighted.length, results_options.teaser_word_count); + + let cur_sum = 0; + for (let wordindex = 0; wordindex < window_size; wordindex++) { + cur_sum += weighted[wordindex][1]; + } + window_weight.push(cur_sum); + for (let wordindex = 0; wordindex < weighted.length - window_size; wordindex++) { + cur_sum -= weighted[wordindex][1]; + cur_sum += weighted[wordindex + window_size][1]; + window_weight.push(cur_sum); + } + + let max_sum_window_index = 0; + if (searchterm_found) { + let max_sum = 0; + // backwards + for (let i = window_weight.length - 1; i >= 0; i--) { + if (window_weight[i] > max_sum) { + max_sum = window_weight[i]; + max_sum_window_index = i; + } + } + } else { + max_sum_window_index = 0; + } + + // add around searchterms + const teaser_split = []; + index = weighted[max_sum_window_index][2]; + for (let i = max_sum_window_index; i < max_sum_window_index + window_size; i++) { + const word = weighted[i]; + if (index < word[2]) { + // missing text from index to start of `word` + teaser_split.push(body.substring(index, word[2])); + index = word[2]; + } + if (word[1] === searchterm_weight) { + teaser_split.push(''); + } + index = word[2] + word[0].length; + teaser_split.push(body.substring(word[2], index)); + if (word[1] === searchterm_weight) { + teaser_split.push(''); + } + } + + return teaser_split.join(''); + } + + function init(config) { + results_options = config.results_options; + search_options = config.search_options; + doc_urls = config.doc_urls; + searchindex = elasticlunr.Index.load(config.index); + + // Set up events + searchicon.addEventListener('click', () => { + searchIconClickHandler(); + }, false); + searchbar.addEventListener('keyup', () => { + searchbarKeyUpHandler(); + }, false); + document.addEventListener('keydown', e => { + globalKeyHandler(e); + }, false); + // If the user uses the browser buttons, do the same as if a reload happened + window.onpopstate = () => { + doSearchOrMarkFromUrl(); + }; + // Suppress "submit" events so the page doesn't reload when the user presses Enter + document.addEventListener('submit', e => { + e.preventDefault(); + }, false); + + // If reloaded, do the search or mark again, depending on the current url parameters + doSearchOrMarkFromUrl(); + + // Exported functions + config.hasFocus = hasFocus; + } + + function unfocusSearchbar() { + // hacky, but just focusing a div only works once + const tmp = document.createElement('input'); + tmp.setAttribute('style', 'position: absolute; opacity: 0;'); + searchicon.appendChild(tmp); + tmp.focus(); + tmp.remove(); + } + + // On reload or browser history backwards/forwards events, parse the url and do search or mark + function doSearchOrMarkFromUrl() { + // Check current URL for search request + const url = parseURL(window.location.href); + if (Object.prototype.hasOwnProperty.call(url.params, URL_SEARCH_PARAM) + && url.params[URL_SEARCH_PARAM] !== '') { + showSearch(true); + searchbar.value = decodeURIComponent( + (url.params[URL_SEARCH_PARAM] + '').replace(/\+/g, '%20')); + searchbarKeyUpHandler(); // -> doSearch() + } else { + showSearch(false); + } + + if (Object.prototype.hasOwnProperty.call(url.params, URL_MARK_PARAM)) { + const words = decodeURIComponent(url.params[URL_MARK_PARAM]).split(' '); + marker.mark(words, { + exclude: mark_exclude, + }); + + const markers = document.querySelectorAll('mark'); + const hide = () => { + for (let i = 0; i < markers.length; i++) { + markers[i].classList.add('fade-out'); + window.setTimeout(() => { + marker.unmark(); + }, 300); + } + }; + + for (let i = 0; i < markers.length; i++) { + markers[i].addEventListener('click', hide); + } + } + } + + // Eventhandler for keyevents on `document` + function globalKeyHandler(e) { + if (e.altKey || + e.ctrlKey || + e.metaKey || + e.shiftKey || + e.target.type === 'textarea' || + e.target.type === 'text' || + !hasFocus() && /^(?:input|select|textarea)$/i.test(e.target.nodeName) + ) { + return; + } + + if (e.key === 'Escape') { + e.preventDefault(); + searchbar.classList.remove('active'); + setSearchUrlParameters('', + searchbar.value.trim() !== '' ? 'push' : 'replace'); + if (hasFocus()) { + unfocusSearchbar(); + } + showSearch(false); + marker.unmark(); + } else if (!hasFocus() && (e.key === 's' || e.key === '/')) { + e.preventDefault(); + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else if (hasFocus() && (e.key === 'ArrowDown' + || e.key === 'Enter')) { + e.preventDefault(); + const first = searchresults.firstElementChild; + if (first !== null) { + unfocusSearchbar(); + first.classList.add('focus'); + if (e.key === 'Enter') { + window.location.assign(first.querySelector('a')); + } + } + } else if (!hasFocus() && (e.key === 'ArrowDown' + || e.key === 'ArrowUp' + || e.key === 'Enter')) { + // not `:focus` because browser does annoying scrolling + const focused = searchresults.querySelector('li.focus'); + if (!focused) { + return; + } + e.preventDefault(); + if (e.key === 'ArrowDown') { + const next = focused.nextElementSibling; + if (next) { + focused.classList.remove('focus'); + next.classList.add('focus'); + } + } else if (e.key === 'ArrowUp') { + focused.classList.remove('focus'); + const prev = focused.previousElementSibling; + if (prev) { + prev.classList.add('focus'); + } else { + searchbar.select(); + } + } else { // Enter + window.location.assign(focused.querySelector('a')); + } + } + } + + function showSearch(yes) { + if (yes) { + search_wrap.classList.remove('hidden'); + searchicon.setAttribute('aria-expanded', 'true'); + } else { + search_wrap.classList.add('hidden'); + searchicon.setAttribute('aria-expanded', 'false'); + const results = searchresults.children; + for (let i = 0; i < results.length; i++) { + results[i].classList.remove('focus'); + } + } + } + + function showResults(yes) { + if (yes) { + searchresults_outer.classList.remove('hidden'); + } else { + searchresults_outer.classList.add('hidden'); + } + } + + // Eventhandler for search icon + function searchIconClickHandler() { + if (search_wrap.classList.contains('hidden')) { + showSearch(true); + window.scrollTo(0, 0); + searchbar.select(); + } else { + showSearch(false); + } + } + + // Eventhandler for keyevents while the searchbar is focused + function searchbarKeyUpHandler() { + const searchterm = searchbar.value.trim(); + if (searchterm !== '') { + searchbar.classList.add('active'); + doSearch(searchterm); + } else { + searchbar.classList.remove('active'); + showResults(false); + removeChildren(searchresults); + } + + setSearchUrlParameters(searchterm, 'push_if_new_search_else_replace'); + + // Remove marks + marker.unmark(); + } + + // Update current url with ?URL_SEARCH_PARAM= parameter, remove ?URL_MARK_PARAM and + // `#heading-anchor`. `action` can be one of "push", "replace", + // "push_if_new_search_else_replace" and replaces or pushes a new browser history item. + // "push_if_new_search_else_replace" pushes if there is no `?URL_SEARCH_PARAM=abc` yet. + function setSearchUrlParameters(searchterm, action) { + const url = parseURL(window.location.href); + const first_search = !Object.prototype.hasOwnProperty.call(url.params, URL_SEARCH_PARAM); + + if (searchterm !== '' || action === 'push_if_new_search_else_replace') { + url.params[URL_SEARCH_PARAM] = searchterm; + delete url.params[URL_MARK_PARAM]; + url.hash = ''; + } else { + delete url.params[URL_MARK_PARAM]; + delete url.params[URL_SEARCH_PARAM]; + } + // A new search will also add a new history item, so the user can go back + // to the page prior to searching. A updated search term will only replace + // the url. + if (action === 'push' || action === 'push_if_new_search_else_replace' && first_search ) { + history.pushState({}, document.title, renderURL(url)); + } else if (action === 'replace' || + action === 'push_if_new_search_else_replace' && + !first_search + ) { + history.replaceState({}, document.title, renderURL(url)); + } + } + + function doSearch(searchterm) { + // Don't search the same twice + if (current_searchterm === searchterm) { + return; + } else { + current_searchterm = searchterm; + } + + if (searchindex === null) { + return; + } + + // Do the actual search + const results = searchindex.search(searchterm, search_options); + const resultcount = Math.min(results.length, results_options.limit_results); + + // Display search metrics + searchresults_header.innerText = formatSearchMetric(resultcount, searchterm); + + // Clear and insert results + const searchterms = searchterm.split(' '); + removeChildren(searchresults); + for (let i = 0; i < resultcount ; i++) { + const resultElem = document.createElement('li'); + resultElem.innerHTML = formatSearchResult(results[i], searchterms); + searchresults.appendChild(resultElem); + } + + // Display results + showResults(true); + } + + function loadScript(url, id) { + const script = document.createElement('script'); + script.src = url; + script.id = id; + script.onload = () => init(window.search); + script.onerror = error => { + console.error(`Failed to load \`${url}\`: ${error}`); + }; + document.head.append(script); + } + + loadScript(path_to_root + 'searchindex.js', 'search-index'); + +})(window.search); diff --git a/today/book/searchindex.js b/today/book/searchindex.js new file mode 100644 index 0000000..3299728 --- /dev/null +++ b/today/book/searchindex.js @@ -0,0 +1 @@ +window.search = JSON.parse('{"doc_urls":["2025-06-11.html#ai洞察日报-2025611","daily/2025-06-11.html#ai洞察日报-2025611","daily/2025-06-10.html#ai洞察日报-2025610","daily/2025-06-09.html#ai洞察日报-202569","daily/2025-06-08.html#ai洞察日报-202568","daily/2025-06-07.html#ai洞察日报-202567","daily/2025-06-06.html#ai洞察日报-202566","daily/2025-06-05.html#ai洞察日报-202565","daily/2025-06-04.html#ai洞察日报-2025年6月4日","daily/2025-06-03.html#ai洞察日报-2025年6月3日","daily/2025-06-02.html#ai洞察日报-2025年6月2日","daily/2025-06-01.html#ai洞察日报-2025年6月1日"],"index":{"documentStore":{"docInfo":{"0":{"body":60,"breadcrumbs":3,"title":2},"1":{"body":60,"breadcrumbs":4,"title":2},"10":{"body":56,"breadcrumbs":4,"title":2},"11":{"body":64,"breadcrumbs":4,"title":2},"2":{"body":90,"breadcrumbs":4,"title":2},"3":{"body":49,"breadcrumbs":4,"title":2},"4":{"body":46,"breadcrumbs":4,"title":2},"5":{"body":91,"breadcrumbs":4,"title":2},"6":{"body":72,"breadcrumbs":4,"title":2},"7":{"body":75,"breadcrumbs":4,"title":2},"8":{"body":49,"breadcrumbs":4,"title":2},"9":{"body":57,"breadcrumbs":4,"title":2}},"docs":{"0":{"body":"AI产品与功能更新 豆包大模型家族 将在2025 FORCE原动力大会上,重磅发布全新的 豆包·视频生成模型 。这款模型可谓\\"创意魔法棒”,它凭借高效结构和多任务统一建模等黑科技,不仅支持 无缝多镜头叙事 ,还能 精准响应多动作 ,甚至能像专业摄影师一样 随心运镜 ,轻松生成写实、动漫等多种风格的 高品质视频 ,简直是视频创作者的福音! 图片 xAI开发的 Grok 人工智能正大刀阔斧地接管X平台的 推荐算法 ,同时优化了评论排序机制。这意味着,平台将优先推荐 高质量内容 ,而非仅仅看粉丝量,这无疑给那些粉丝较少但有真材实料的\\"小号”和新人带来了前所未有的曝光机会,旨在打造一个更公平、更开放的内容生态,让好内容不再\\"蒙尘”。 图片 豆包App 近期也对\\"一句话P图”功能进行了全面升级,它基于强大的SeedEdit 3.0模型,新增了一键添加/替换文字、质感风格迁移和局部图像编辑增强等一系列酷炫修图玩法。这波升级简直是把专业修图师请进了手机,让普通用户也能无需专业技能,轻松搞定个性化照片创作,让\\"修图小白”也能变身\\"修图大师”。 图片 苹果在WWDC 2025大会上带来了iOS 26系统的\\"杀手级”功能—— 视觉智能 。有了它,你可以在屏幕上的任何图片或信息上进行提问、搜索,甚至自动识别事件详情,简直是手机的\\"智能眼”。这项升级通过AI技术实现了屏幕内容的\\"一眼识别”,大大提升了交互体验的便捷性与智能化程度,还能自动提取事件信息加入日历,让你的数字生活更加省心。 图片 好消息! 沉浸式翻译 迎来重大更新,现在已能对 推特(X)视频 进行 实时翻译 。即便视频没有原生字幕,它也能帮你\\"神同步”地显示 中英双语字幕 。这下,刷X平台视频再也不用担心语言不通了,简直是跨文化交流的\\"神助攻”,彻底消除了语言障碍,让世界更近。 Link AI前沿研究 香港大学和华为诺亚方舟实验室强强联手,推出了颠覆性的 FUDOKI 模型。这款模型采用 非掩码离散流匹配架构 ,成功突破了传统自回归模型的束缚,实现了更加灵活高效的 多模态生成与理解 能力。它通过独特的 并行去噪机制 ,显著提升了复杂推理和生成任务的表现,尤其在 图像生成 方面表现惊艳,为未来 通用人工智能 的发展铺平了道路。 图片 香港科技大学和快手科技的研究团队联合发布了 EvoSearch(进化搜索)技术 ,这简直是AI作画领域的一股清流!它彻底颠覆了以往\\"大模型、大算力”的固有思维,巧妙地将达尔文的进化论思想融入AI生成过程,让那些\\"小个子”模型也能生成超越甚至媲美\\"大块头”的 高质量图像和视频 。这项突破性技术有望开启AI创作的**\\"智能进化”时代**,让AI模型在推理阶段释放更深层次的潜力。相关项目主页、代码和论文链接已发布: https://tinnerhrhe.github.io/evosearch/ 、 https://github.com/tinnerhrhe/EvoSearch-codes 、 https://arxiv.org/abs/2505.17618 。 图片 图片 一篇名为\\" 玩中泛化:通过游戏学习推理 ”的学术论文揭示了令人兴奋的发现: 多模态大型语言模型(MLLMs) 通过玩简单的 街机游戏 ,竟然能 显著提升其跨领域的多模态推理能力 ,甚至超越了在特定数据上训练的 专业模型 !这无疑为未来 通用AI能力的培养 指明了一条充满趣味的新方向,让AI在\\"玩乐”中变得更聪明。 此链接 新论文《梦境之地》( Dreamland )提出了一种结合物理模拟器与大型生成模型的混合框架。它的目标是创造出高度可控且逼真的动态虚拟世界,不仅显著提升了图像质量与可控性,更重要的是,有望为 具身AI智能体 的训练提供一个理想的\\"游乐场”和\\"实验室”,助力AI在现实世界中更好地学习和行动。 Link AI行业展望与社会影响 理想汽车近期进行了组织架构的\\"大变身”,正式成立了**\\"空间机器人” 和 \\"穿戴机器人” 两个全新的二级部门。这不仅仅是部门调整,更预示着理想汽车正从传统的汽车制造商转型为 智能出行生态构建者**。他们旨在通过机器人技术,构建一个涵盖车内\\"第三空间”和车外智能穿戴设备的完整智能生活服务体系,这无疑将为理想汽车在竞争激烈的市场中带来新的差异化优势,让\\"第三空间”战略不再只是一个概念。 理想汽车 俄亥俄州立大学宣布从今年起,将强制所有学生接受 人工智能(AI)培训 ,这简直是为未来职场\\"量身定制”的技能包!学校推出了**\\"AI流利度”计划**,将AI教育全面融入本科生课程,旨在培养学生将专业知识与AI技术有效结合的能力。当然,学校也强调学生不得利用生成性AI来\\"蒙混过关”,同时加强教师培训以维护 学术诚信 。此举旨在确保每位毕业生都能在其专业领域有效应用AI,并积极响应俄亥俄州AI教育联盟在K-12教育中推动AI教育的努力,让AI真正成为每个人的\\"超级助手”。 学习 考试 高考 教育 (1) 知名思考者李继刚一针见血地指出,当AI技术变得越发 高效强大 时,人类的 判断力 、 品味 和对事物 目的的理解 反而会变得更为 硬核 。因为AI虽然能生成万千方案并完美执行,却无法替代人类进行 选择 、定义 美 ,更无法洞悉复杂且深邃的 人性 。这提醒我们,在AI时代,真正有价值的,或许正是那些AI无法企及的\\"人类专属技能”。 Link 开源TOP项目 小红书的 hi lab 团队近日献出了一份\\"大礼”——首个开源文本大模型 dots.llm1 !这款拥有1420亿参数的 混合专家(MoE)语言模型 ,在海量真实数据训练后,其性能竟然能媲美阿里巴巴的Qwen2.5-72B,这简直是模型界的\\"黑马”!此次开源不仅彰显了小红书在人工智能领域的技术雄心,更旨在提供更智能化的服务,并激励开发者们一起加入AI研究的\\"大合唱”。 图片 近期,GitHub上两个 AI相关 的项目人气爆棚。其中,拥有10785星的\\" newsnow ”项目,它旨在为用户提供 优雅的实时热点新闻阅读体验 ,让信息获取既便捷又高效,简直是\\"新闻控”的福音,地址在这里: 此链接 。另一个是\\" GenAI_Agents ”项目,以12884星的高热度,为开发者提供了 从基础到高级的生成式AI智能体技术教程与实现 ,旨在赋能构建更智能的 交互式AI系统 ,详情可访问: 此链接 。 社媒分享 Gorden Sun在社交媒体上分享了 Mirage 虚拟人模型产品,这款产品简直是\\"数字分身”的魔法师!它能通过音频驱动,生成生动、嘴型同步且表情丰富的 虚拟人视频 ,栩栩如生。Gorden Sun还特别强调,该产品的详细技术报告对研究人员具有极高的参考价值,看来又将引发一场虚拟人技术的\\"军备竞赛”。 Link Sam Altman在X平台发文宣布, o3产品 价格已大幅下调80%,这简直是\\"福利大放送”!他表达了对用户创新使用的期待,并预告了 o3-pro版本 也将提供令人满意的定价。看来,Sora之父又在鼓励大家放开手脚,用更低的成本去探索AI的无限可能了。 Link Ryan ᵐᶠᵉʳ 🦄d/acc抛出了一个关于 下一代创业者 的深刻观点:他们不应被束缚于模仿乔布斯等前代成功模式,也不应受限于 有限的低质量输入 ,而应 忠于自我 ,以 独特 的\\"vibe”和 玩乐精神 去 自由探索 。这就像在说,别做别人的影子,去创造属于你自己的\\"游戏规则”! Link 用户wwwgoubuli分享了AI在实际工作中的一个有趣转变。他提到,远程团队成员初时因担心被视为偷懒而 不敢充分使用AI ,但在他多次分享AI\\"正确用法”后,团队逐渐\\"放开手脚”,结果代码的 注释、规范和质量 均显著提升,同事们也展现出更高的 自信 。这简直是AI赋能团队效率提升的\\"教科书式”案例,打破了心中的\\"AI焦虑”。 Link","breadcrumbs":"Today » AI洞察日报 2025/6/11","id":"0","title":"AI洞察日报 2025/6/11"},"1":{"body":"AI产品与功能更新 豆包大模型家族 将在2025 FORCE原动力大会上,重磅发布全新的 豆包·视频生成模型 。这款模型可谓\\"创意魔法棒”,它凭借高效结构和多任务统一建模等黑科技,不仅支持 无缝多镜头叙事 ,还能 精准响应多动作 ,甚至能像专业摄影师一样 随心运镜 ,轻松生成写实、动漫等多种风格的 高品质视频 ,简直是视频创作者的福音! 图片 xAI开发的 Grok 人工智能正大刀阔斧地接管X平台的 推荐算法 ,同时优化了评论排序机制。这意味着,平台将优先推荐 高质量内容 ,而非仅仅看粉丝量,这无疑给那些粉丝较少但有真材实料的\\"小号”和新人带来了前所未有的曝光机会,旨在打造一个更公平、更开放的内容生态,让好内容不再\\"蒙尘”。 图片 豆包App 近期也对\\"一句话P图”功能进行了全面升级,它基于强大的SeedEdit 3.0模型,新增了一键添加/替换文字、质感风格迁移和局部图像编辑增强等一系列酷炫修图玩法。这波升级简直是把专业修图师请进了手机,让普通用户也能无需专业技能,轻松搞定个性化照片创作,让\\"修图小白”也能变身\\"修图大师”。 图片 苹果在WWDC 2025大会上带来了iOS 26系统的\\"杀手级”功能—— 视觉智能 。有了它,你可以在屏幕上的任何图片或信息上进行提问、搜索,甚至自动识别事件详情,简直是手机的\\"智能眼”。这项升级通过AI技术实现了屏幕内容的\\"一眼识别”,大大提升了交互体验的便捷性与智能化程度,还能自动提取事件信息加入日历,让你的数字生活更加省心。 图片 好消息! 沉浸式翻译 迎来重大更新,现在已能对 推特(X)视频 进行 实时翻译 。即便视频没有原生字幕,它也能帮你\\"神同步”地显示 中英双语字幕 。这下,刷X平台视频再也不用担心语言不通了,简直是跨文化交流的\\"神助攻”,彻底消除了语言障碍,让世界更近。 Link AI前沿研究 香港大学和华为诺亚方舟实验室强强联手,推出了颠覆性的 FUDOKI 模型。这款模型采用 非掩码离散流匹配架构 ,成功突破了传统自回归模型的束缚,实现了更加灵活高效的 多模态生成与理解 能力。它通过独特的 并行去噪机制 ,显著提升了复杂推理和生成任务的表现,尤其在 图像生成 方面表现惊艳,为未来 通用人工智能 的发展铺平了道路。 图片 香港科技大学和快手科技的研究团队联合发布了 EvoSearch(进化搜索)技术 ,这简直是AI作画领域的一股清流!它彻底颠覆了以往\\"大模型、大算力”的固有思维,巧妙地将达尔文的进化论思想融入AI生成过程,让那些\\"小个子”模型也能生成超越甚至媲美\\"大块头”的 高质量图像和视频 。这项突破性技术有望开启AI创作的**\\"智能进化”时代**,让AI模型在推理阶段释放更深层次的潜力。相关项目主页、代码和论文链接已发布: https://tinnerhrhe.github.io/evosearch/ 、 https://github.com/tinnerhrhe/EvoSearch-codes 、 https://arxiv.org/abs/2505.17618 。 图片 图片 一篇名为\\" 玩中泛化:通过游戏学习推理 ”的学术论文揭示了令人兴奋的发现: 多模态大型语言模型(MLLMs) 通过玩简单的 街机游戏 ,竟然能 显著提升其跨领域的多模态推理能力 ,甚至超越了在特定数据上训练的 专业模型 !这无疑为未来 通用AI能力的培养 指明了一条充满趣味的新方向,让AI在\\"玩乐”中变得更聪明。 此链接 新论文《梦境之地》( Dreamland )提出了一种结合物理模拟器与大型生成模型的混合框架。它的目标是创造出高度可控且逼真的动态虚拟世界,不仅显著提升了图像质量与可控性,更重要的是,有望为 具身AI智能体 的训练提供一个理想的\\"游乐场”和\\"实验室”,助力AI在现实世界中更好地学习和行动。 Link AI行业展望与社会影响 理想汽车近期进行了组织架构的\\"大变身”,正式成立了**\\"空间机器人” 和 \\"穿戴机器人” 两个全新的二级部门。这不仅仅是部门调整,更预示着理想汽车正从传统的汽车制造商转型为 智能出行生态构建者**。他们旨在通过机器人技术,构建一个涵盖车内\\"第三空间”和车外智能穿戴设备的完整智能生活服务体系,这无疑将为理想汽车在竞争激烈的市场中带来新的差异化优势,让\\"第三空间”战略不再只是一个概念。 理想汽车 俄亥俄州立大学宣布从今年起,将强制所有学生接受 人工智能(AI)培训 ,这简直是为未来职场\\"量身定制”的技能包!学校推出了**\\"AI流利度”计划**,将AI教育全面融入本科生课程,旨在培养学生将专业知识与AI技术有效结合的能力。当然,学校也强调学生不得利用生成性AI来\\"蒙混过关”,同时加强教师培训以维护 学术诚信 。此举旨在确保每位毕业生都能在其专业领域有效应用AI,并积极响应俄亥俄州AI教育联盟在K-12教育中推动AI教育的努力,让AI真正成为每个人的\\"超级助手”。 学习 考试 高考 教育 (1) 知名思考者李继刚一针见血地指出,当AI技术变得越发 高效强大 时,人类的 判断力 、 品味 和对事物 目的的理解 反而会变得更为 硬核 。因为AI虽然能生成万千方案并完美执行,却无法替代人类进行 选择 、定义 美 ,更无法洞悉复杂且深邃的 人性 。这提醒我们,在AI时代,真正有价值的,或许正是那些AI无法企及的\\"人类专属技能”。 Link 开源TOP项目 小红书的 hi lab 团队近日献出了一份\\"大礼”——首个开源文本大模型 dots.llm1 !这款拥有1420亿参数的 混合专家(MoE)语言模型 ,在海量真实数据训练后,其性能竟然能媲美阿里巴巴的Qwen2.5-72B,这简直是模型界的\\"黑马”!此次开源不仅彰显了小红书在人工智能领域的技术雄心,更旨在提供更智能化的服务,并激励开发者们一起加入AI研究的\\"大合唱”。 图片 近期,GitHub上两个 AI相关 的项目人气爆棚。其中,拥有10785星的\\" newsnow ”项目,它旨在为用户提供 优雅的实时热点新闻阅读体验 ,让信息获取既便捷又高效,简直是\\"新闻控”的福音,地址在这里: 此链接 。另一个是\\" GenAI_Agents ”项目,以12884星的高热度,为开发者提供了 从基础到高级的生成式AI智能体技术教程与实现 ,旨在赋能构建更智能的 交互式AI系统 ,详情可访问: 此链接 。 社媒分享 Gorden Sun在社交媒体上分享了 Mirage 虚拟人模型产品,这款产品简直是\\"数字分身”的魔法师!它能通过音频驱动,生成生动、嘴型同步且表情丰富的 虚拟人视频 ,栩栩如生。Gorden Sun还特别强调,该产品的详细技术报告对研究人员具有极高的参考价值,看来又将引发一场虚拟人技术的\\"军备竞赛”。 Link Sam Altman在X平台发文宣布, o3产品 价格已大幅下调80%,这简直是\\"福利大放送”!他表达了对用户创新使用的期待,并预告了 o3-pro版本 也将提供令人满意的定价。看来,Sora之父又在鼓励大家放开手脚,用更低的成本去探索AI的无限可能了。 Link Ryan ᵐᶠᵉʳ 🦄d/acc抛出了一个关于 下一代创业者 的深刻观点:他们不应被束缚于模仿乔布斯等前代成功模式,也不应受限于 有限的低质量输入 ,而应 忠于自我 ,以 独特 的\\"vibe”和 玩乐精神 去 自由探索 。这就像在说,别做别人的影子,去创造属于你自己的\\"游戏规则”! Link 用户wwwgoubuli分享了AI在实际工作中的一个有趣转变。他提到,远程团队成员初时因担心被视为偷懒而 不敢充分使用AI ,但在他多次分享AI\\"正确用法”后,团队逐渐\\"放开手脚”,结果代码的 注释、规范和质量 均显著提升,同事们也展现出更高的 自信 。这简直是AI赋能团队效率提升的\\"教科书式”案例,打破了心中的\\"AI焦虑”。 Link","breadcrumbs":"06-11-日刊 » AI洞察日报 2025/6/11","id":"1","title":"AI洞察日报 2025/6/11"},"10":{"body":"AI产品与功能更新 Runway公司最新推出的 Gen-4References 功能已支持移动设备,使用户能通过手机照片结合自然语言提示,快速生成风格一致的艺术作品。这项功能将 AI生成技术 与移动便捷性完美结合,大幅降低了 AI创作 门槛,为内容创作者和普通用户带来了无限可能。 图片 Anthropic近期宣布,其旗舰模型 Claude 已新增功能,支持开发者构建能与Claude直接对话的 AI应用程序 ,这与 AI Studio 的开发理念高度契合。此举不仅降低了 AI应用开发 门槛,为开发者提供了更广阔的创新空间,也预示着AI应用普及与落地将进一步加速。 图片 AI前沿研究 华为近期通过其\\"昇腾 + Pangu Ultra MoE”系统展示了一项惊人突破:一个近万亿参数的MoE大模型,在不使用GPU的情况下,仅需2秒便能解答一道高等数学题。这不仅彰显了华为在自主可控国产算力与模型训练方面的强大实力,也为未来大规模AI模型的训练与应用开辟了新可能。 图片 这篇论文通过构建一个英语回文谜题基准测试,揭示了当前 视觉-语言模型 ( VLM )在理解和解决这类谜题时遇到的显著困难。尽管VLM在解码简单视觉线索方面表现出一定能力,但对于需要 抽象推理 、 横向思维 及理解 视觉隐喻 的任务,它们仍旧力不从心,表明多模态抽象是其面临的独特挑战。详情请见: Link 。 LoRAShop 是一个创新的 多概念图像编辑框架 ,它利用 修正流Transformer 的特性,实现了在不重新训练模型的情况下,将多个主题或风格无缝融入原始场景。这项技术通过智能融合LoRA权重,不仅保留了图像的整体背景和细节,还在身份保持上超越了现有基线,为个性化 图像生成 和 编辑 带来了革命性的\\"Photoshop式”体验。详情请见: Link 。 DeepTheorem 是一个利用 自然语言 和 强化学习 ( RL-Zero )来增强 大型语言模型 ( LLM )数学推理能力的非正式 定理证明框架 。该框架通过一个大规模高质量数据集和创新策略,显著提升了LLM在IMO级别非正式定理证明中的表现,展现了其在数学探索和自动化证明领域的巨大潜力。详情请见: Link 。 AI行业展望与社会影响 根据阿姆斯特丹自由大学环境研究所博士生Alex de Vries-Gao的分析,人工智能的电力消耗预计将在2025年底前接近全球数据中心总电力消耗的一半,这意味着其能耗将很快超越比特币挖矿。尽管技术效率有所提升,但AI的电力需求仍在快速增长,凸显了在能耗与可持续发展之间寻找平衡的重要性。 图片 近期,黑客通过伪装成 阿里云AI SDK 的恶意软件包,成功实施了供应链攻击,利用隐藏在 Pickle 格式ML模型中的 恶意代码 窃取用户敏感信息。这揭示了 AI安全供应链 面临的新挑战,传统安全工具在检测恶意ML模型方面的不足,以及开发者面临的潜在风险。 图片 开源TOP项目 courses 是一个由Anthropic提供的 教育课程 项目,旨在帮助用户学习相关知识。该项目在GitHub上拥有 13483 颗星,可访问其GitHub页面: Link 。 agent-zero 是一个提供 AI框架 功能的项目,旨在帮助开发者构建AI应用。该项目在GitHub上获得了 7360 颗星,详情可前往: Link 。 cobalt 是一个致力于\\" 保存你所喜爱事物的最佳方式 ”的项目,为用户提供高效的收藏管理功能。该项目在GitHub上备受欢迎,拥有 32941 颗星,可通过 Link 查看详情。 the-book-of-secret-knowledge 是一个内容丰富的 知识集合 项目,汇集了鼓舞人心的列表、手册、备忘单及各类工具。该项目在GitHub上拥有高达 171992 颗星,是寻求实用信息和技巧的宝库,访问地址为: Link 。","breadcrumbs":"06-02-日刊 » AI洞察日报 2025年6月2日","id":"10","title":"AI洞察日报 2025年6月2日"},"11":{"body":"近日, 通义实验室 自然语言智能团队 发布并开源 了 VRAG-RL ——一款 视觉感知多模态RAG推理框架 ,旨在解决 AI 从图像、表格等 视觉语言 中检索关键信息并进行 精细化推理 的难题,其强化学习和创新的视觉感知机制显著提升了对视觉信息的理解和检索效率。该框架在多个基准数据集上 表现出色 ,未来有望提升模型在不同视觉任务中的 泛化能力 ,请查阅 跳转链接 了解更多。 亚利桑那州立大学研究小组 发布论文 指出, 大语言模型 并非进行 真正推理 ,而仅仅是在 寻找数据间的相关性 ,这可能导致公众对其工作机制产生 误解 。该研究强调,在日益依赖 AI 的时代,我们需更 谨慎看待 技术能力,未来 AI研究 有望朝着更具 解释性 的方向发展。 Perplexity AI 正式 推出Perplexity Labs ,为Pro订阅用户带来 多工具协同 的全新 AI生产力工具 ,能将复杂项目开发流程简化至数分钟,旨在提供从创意到成果的 全链条支持 。这一功能通过深度网络浏览、代码执行等 核心能力 ,标志着Perplexity从答案引擎向 综合性AI生产平台转型 。 夸克 近日 上线“深度研究”功能 ,该功能依托 通义千问大模型 ,能围绕学术课题、行业分析等复杂议题,自动完成从资料搜集到 报告生成 的全流程研究。此举标志着 AI 正从 信息检索工具 向 内容创作伙伴 进一步跃迁,为科研调研、市场洞察等场景提供 高效支持 。 阿里云 正式 发布通义灵码 AI IDE ,这是一款原生的人工智能开发环境,凭借强大的 编程智能体模式 、 长期记忆 和 行间建议预测 功能,显著提升开发者 编程效率 。该产品已 免费开放下载 ,并且其插件累计生成超30亿行代码,成为广受欢迎的编程辅助工具,为企业开发工作提供 强力支持 。 Memvid 是一款 创新AI记忆工具 ,通过将 文本数据编码为MP4视频 ,实现了 亚秒级快速语义搜索 ,大幅节省存储空间并支持离线使用。它内置 聊天功能 ,支持 PDF文档导入 ,为 高效知识管理 和 学术研究 等领域提供了革命性的 全新可能 ,请查阅 跳转链接 了解更多。 Anthropic首席执行官达里奥・阿莫代伊 警告 称, AI 可能在未来五年内 取代一半入门级白领工作 ,导致 失业率飙升 至10%-20%,并加剧 经济不平等 。他呼吁提高公众对 AI 发展的 认知 和 AI素养 ,以便人们适应未来职业环境,并强调政策制定者需思考超智能经济下的 解决方案 。 AI初创公司 Manus 重磅 发布Manus Slides 功能,用户仅需一个提示词即可 一键生成专业幻灯片 ,涵盖商务会议、教育课程等多种场景,大幅 提升演示文稿创作效率 。该功能凭借 智能生成 和 灵活编辑 能力,支持导出PowerPoint或PDF,标志着 AI代理 正从任务自动化向 生产力工具 进一步演进。 在GitHub上拥有 7086颗星 的 prompt-eng-interactive-tutorial ,是Anthropic公司 交互式提示工程教程 的开源项目,旨在帮助用户 有趣且有效地学习提示工程 ,具体请访问 跳转链接 。 获得 10143颗星 的 onlook 项目,是一个 开源可视化氛围编码编辑器 ,它利用 AI 帮助设计师或开发者 可视化构建 、 美化和编辑React应用 。这款工具就像是设计师的 光标 ,让 React开发 变得更 直观高效 ,具体请访问 跳转链接 。 拥有 12755颗星 的 anthropic-cookbook 项目,是Anthropic公司 展示如何有趣且有效地使用Claude 的 笔记本/秘籍集合 。它为用户提供了多样化的 Claude使用方法 ,是 学习和应用Claude 的便捷 跳转链接 。 MMSI-Bench 是一个针对 多图像空间智能 的 VQA基准测试 ,研究发现,尽管多模态大语言模型(MLLMs)已取得进展,但在 多图像空间推理 方面,其准确率(30-40%)与人类(97%)之间存在 巨大差距 。该研究诊断了模型四种主要的 失败模式 ,为未来提升 多图像空间智能 提供了 宝贵见解 ,论文详情请见 跳转链接 。 ZeroGUI 是一个创新的 在线学习框架 ,它以 零人力成本自动化GUI智能体训练 ,通过基于VLM的自动任务生成和奖励评估,克服了传统GUI学习对人工标注的 重度依赖 。实验证明,该框架显著提升了 GUI智能体 在不同环境下的 性能 ,为 自动化GUI操作 带来了 高效解决方案 ,论文详情请见 跳转链接 。 ATLAS 是一个针对 Transformer 架构设计的高容量 长期记忆模块 ,它通过优化 记忆上下文 来克服现有模型在 长序列理解 上的局限,从而在测试时学习最优的记忆策略。实验结果表明, ATLAS 在语言建模和长上下文理解等任务中表现优于Transformer和线性循环模型,显著 提升了性能 ,论文详情请见 跳转链接 。","breadcrumbs":"06-01-日刊 » AI洞察日报 2025年6月1日","id":"11","title":"AI洞察日报 2025年6月1日"},"2":{"body":"AI产品与功能更新 Google 近日调整 AI 模型 使用政策,自5月起, Google AI Studio 已停止向免费用户提供 Gemini 2.5 Pro 系列模型调用权限,未来开发者需自行提供 API 密钥 接入服务。此举引发了开发者社区的广泛关注,分析认为这是 Google 推动 Gemini 商业化进程、将高性能模型纳入付费体系的信号。 图片 据官方数据显示,阿里旗下 通义千问3 大模型开源仅一个月,其全球累计下载量已突破 1250万次 ,并在 Hugging Face 等主流 AI 开源平台上,衍生模型数量超过 13万个 ,跃居全球第一。这一爆发式增长不仅代表着国产大模型的开源实力正与国际水平接轨,也进一步巩固了阿里在全球 AI 基础模型生态 中的影响力。 图片 轻量级文档解析模型 MonkeyOCR 近日震撼登场,它以仅 3B参数 的轻量级架构,在英文文档解析任务中展现出惊艳性能,超越了 Gemini 2.5 Pro 等重量级模型,并大幅提升了处理速度。其核心创新在于采用\\" 结构-识别-关系 ”三元组范式,这不仅提升了解析准确率,还显著降低了计算资源需求,为中小型企业部署 AI 文档解析解决方案提供了可能。 图片 论文链接: https://arxiv.org/abs/2506.05218 在近期一场采用2025年高考新课标Ⅰ卷客观题的数学挑战中, 字节 的 豆包 和 腾讯 的 元宝 表现出色,以68分的成绩并列第一,充分展现了其在复杂推理场景下的潜力。此次比赛不仅揭示了各大 AI 模型 在高考数学上的能力与不足,也反映出它们在细节处理、公式应用和逻辑推理方面的显著进步,为未来 AI 数学能力 的发展奠定了基础。 图片 图片 AI行业展望与社会影响 架构师 罗伯特・卡鲁索 近日进行了一项跨时代实验,结果显示1977年推出的 Atari 2600 游戏机国际象棋引擎轻松击败了 OpenAI 的 ChatGPT 。 ChatGPT 在比赛中频繁犯错、混淆棋子,这引发了公众对 复古科技 与 现代 AI 棋艺水平的讨论和反思。 图片 博主 wwwgoubuli 认为 AI 编程代理 正进入平台期,尽管当前模型如 Gemini 2.5 Pro 和 Claude 表现强劲,但模型层面的\\"飞升”空间有限。他预计未来将有更多产品井喷式发展,而重点在于 载体 、 媒介 和 IDE/plugin 等方面的完善,而非核心模型能力的突破。 Link 开源TOP项目 vosk-api 是一个拥有 10342 颗星的开源项目,它提供适用于 Android 、 iOS 、 树莓派 和服务器的 离线语音识别 API ,并支持 Python 、 Java 、 C# 和 Node 等多语言开发。 Link RAG_Techniques 是一个拥有 17002 颗星的开源项目,该仓库展示了 检索增强生成(RAG)系统 的各种先进技术。它结合了 信息检索 和 生成模型 ,旨在为用户提供更加准确且上下文丰富的 AI 回复。 Link Seelen-UI 是一个拥有 7257 颗星的开源项目,它提供了一个 完全可定制 的 桌面环境 ,专为 Windows 10/11 用户设计,让用户能够打造个性化的操作界面。 Link Meng Shao 分享了5个精选的 开源项目 ,旨在帮助 AI 工程师 提升技能并获得\\"超能力”,尤其是在 LLMs 和生成式 AI Agent 领域。这些项目涵盖了从 LLM 基础知识、 AI Agent 构建、生产级机器学习应用部署到 提示工程 等关键学习资源。 图片 Link 社媒分享 博主 归藏 详细介绍了如何在 Liblib 平台在线使用 FLUX Kontext 工具进行图片修改,无需本地运行 Comfyui ,并分享了涵盖单图、双图、三图融合及图片放大功能的 工作流 。 Liblib 上线的 Kontext 提供了便捷的在线处理能力,旨在帮助用户轻松掌握图片创作的各种高级技巧。 图片 Link Tw93 推荐了 PayQrcode 方案,该方案通过 物理图片合并技术 ,成功将 微信 与 支付宝 收款码融合为单张图片,实现了线下离线场景下的 双码兼容识别 。这项创新解决了传统双码不便的问题,并经本地测试证明识别效果良好,极大地提升了支付便利性。 图片 Link","breadcrumbs":"06-10-日刊 » AI洞察日报 2025/6/10","id":"2","title":"AI洞察日报 2025/6/10"},"3":{"body":"AI产品与功能更新 OpenAI 宣布 ChatGPT 高级语音功能升级,显著提升了语音交互的自然性和流畅度,使其 语调更自然、节奏更真实、情绪表达更丰富 ,并加入了 双向自动翻译 功能,能持续进行多轮对话翻译,无需重复指令,特别适用于国际出行、远程办公和语言学习等场景。 面壁智能于6月6日发布了 MiniCPM 4.0系列 模型,包括8B稀疏版和0.5B轻巧版,在端侧性能上实现了 极限情况下220倍、常规5倍的速度提升 ,通过 系统级稀疏创新 和高效双频换挡技术,大幅减少了端侧存储需求,并已成功适配Intel、高通等主流芯片。 图片 开源TOP项目 tensorzero ( Link ) 是一款拥有4869个Star的项目,它为LLM应用创建了一个 反馈循环 ,旨在将生产数据转化为更智能、更快、更经济的模型。 HumanSystemOptimization ( Link ) 是一个拥有15170个Star的项目,提供了一份名为\\" 健康学习到150岁 ”的 人体系统调优指南 。 omni-tools ( Link ) 拥有2940个Star,它提供了一套 自托管的网页工具集 ,用于日常任务,强调 无广告、无跟踪 ,且可在浏览器中快速便捷使用。 BlackFriday-GPTs-Prompts ( Link ) 是一个拥有7018个Star的项目,提供了 无需Plus订阅即可使用的免费GPTs列表 。 社媒分享 ginobefun分享了关于 RAG技巧与底层代码剖析 的文章( Link ),强调通过手写代码理解RAG核心逻辑,并详细介绍了 语义分块 与 上下文增强检索 如何提升大模型问答质量。 黄赟认为 AI数字人 将成为电商平台的标配( Link ),并提到近期 AI主播被\\"开发者模式”玩坏 的现象,导致技术服务商需紧急修复漏洞。 歸藏展示了 FLUX kontext 在修改汽车宣传图方面的强大能力( Link ),能将汽车背景更换为黄昏沙滩或赛道,并智能地为行驶中的车轮 添加运动模糊效果 。 图片 图片 izx-copy分享了Google的建议( Link ),鼓励开发者直接使用其高质量的 深度研究代码库 ,而非自行开发,认为其比\\"vibe coding”版本更优。 图片 Yangyi呼吁开发 \\"睿智的AI” ( Link ),即能够 快速识别幻觉和虚假信息 的AI,并提出了 AI幻觉专家网络 的概念,认为这能帮助AI自主辨别信息真伪,提升输出可靠性。 pimgeek转发了一篇关于公司 用ChatGPT替代客服导致翻车 的文章( Link ),文章指出用户更倾向于与真人客服沟通,数据显示多数用户不希望产品引入AI客服,甚至会因此考虑更换竞争对手。 图片","breadcrumbs":"06-09-日刊 » AI洞察日报 2025/6/9","id":"3","title":"AI洞察日报 2025/6/9"},"4":{"body":"AI产品与功能更新 阿里巴巴于6月6日正式开源了全新的 千问3向量模型 系列 Qwen3-Embedding ,其在文本检索、聚类和分类等任务上的性能提升超40%,并超越谷歌和OpenAI的顶尖模型,获得了同类模型的 最佳性能 (SOTA),同时具备强大的多语言支持能力。 图片 该系列共9款模型,已在魔搭社区、Hugging Face和GitHub等平台开源,并可通过阿里云百炼使用API服务,为全球开发者提供了更高效的AI应用空间。 AI 驱动的本地视频编辑工具 Diffusion Studio Pro 正式亮相,该产品被誉为\\"CapCut + Cursor”结合,以本地优先、浏览器为基础的非线性编辑体验,集成了超过16种生成式 AI模型 ,旨在降低创作门槛并大幅提升专业视频创作者的工作效率。其提供免费无限层级,有望成为AI驱动视频编辑的行业标杆,为创作者带来更高效、直观的创作体验。 谷歌于6月5日发布了名为 Portraits 的创新 AI产品 ,用户可通过与虚拟专家进行实时对话,获得个性化的沟通技巧与领导力学习体验,首批虚拟专家基于知名畅销书作者打造。 图片 该产品依托谷歌先进的 生成式AI技术 ,强调交互性和实践性,目前仅对美国IP用户开放测试,预示着 AI教育 将迈向更互动、更个性化的新阶段。 AI前沿研究 在第七届\\"北京智源大会”上,智源研究院重磅推出了一系列名为\\"悟界”的 大模型 ,其中包括原生多模态世界模型 Emu3 、脑科学多模态通用基础模型见微 Brainμ ,以及具身智能的协作框架 RoboOS2.0 和 RoboBrain2.0 等。 图片 这些模型旨在推动人工智能在医疗、教育、环境监测等多个重要领域的应用落地,展现了智源研究院在 多模态智能技术 方面的雄心和实力。 开源TOP项目 react-bits 是一个拥有 12729 星的开源 React组件集合 ,它提供动画、交互式且完全可定制的组件,旨在帮助开发者构建出令人惊叹且难以忘怀的用户界面。项目地址: Link 。 art-design-pro 是一个拥有 1729 星的Vue 3管理后台模板,它采用Vite + TypeScript + Element Plus构建,专注于优化用户体验和视觉设计。项目地址: Link 。 社媒分享 刘勿锋分享了用 Claude 画图时的一个实用小技巧:通过简单的提示词,可以指导Claude调用如 iconfont 、 Lucied React图标库 等第三方图标库,而非使用系统默认的emoji,从而大幅提升前端网页的视觉美观度和风格统一性。 图片 图片 更多详情请访问: Link 。 wwwgoubuli预估接下来社交媒体上将出现两种热门内容:一部分是深入分析 作文题目 的讨论,另一部分则是围绕 AI写作文 展开的创作比拼,展现了对当前AI应用趋势的敏锐观察。更多信息: Link 。","breadcrumbs":"06-08-日刊 » AI洞察日报 2025/6/8","id":"4","title":"AI洞察日报 2025/6/8"},"5":{"body":"AI产品与功能更新 近日,德国科技巨头 博世 与 阿里云 合作,将 通义大模型 应用于 智能座舱 ,通过云计算与端侧混合计算实现与 3D 数字人 的交互,提升座舱智能感知和多模态控制能力。该方案支持知识问答和同声传译,使智能座舱成为理解并满足用户需求的智能助手,标志着汽车行业正迈向个性化、智能化的移动空间。 Perplexity AI 近日推出 SEC 文件访问功能,旨在帮助各类投资者在 Perplexity 平台 轻松查询和理解复杂的 财务文档 ,所有答案均附有引用。此外, Perplexity 还推出了\\" 实验室 ”功能,该功能能够将用户的提示转化为报告、仪表板等完整项目,显著提升了工作流效率。 Trae 平台 近日更新,正式集成 Google 的 Gemini 2.5 Pro Preview 模型,该模型在 WebDev Arena 和 LMArena 编码排行榜 中均位列第一,显著提升了前端开发与 UI 设计 能力。 图片 此次升级优化了代码转换、编辑及复杂代理工作流,并已免费向用户开放,有望推动 AI 在 区块链 和 去中心化应用 领域的创新。 海外知名的 AI 视频生成平台 PixVerse 正式推出其国内版\\" 拍我AI ”,同步上线移动端 App 和网页版,旨在为国内内容创作者和企业提供高效便捷的 AI 视频生成工具 。 图片 \\" 拍我AI ”支持通过文本或图像一键生成高质量、多风格视频,依托 PixVerse V4.5 算法并进行了本地化优化,有望推动中国市场 AI 视频技术 的普及和应用。 ElevenLabs 于2025年6月5日发布了被誉为\\"地表最强”的 文本转语音(TTS)模型 , Eleven v3 (Alpha 版) ,该模型不仅能将文本转化为自然流畅的语音,还能通过 音频标签 精确控制情感、语速甚至加入音效,实现\\"演技合成”。 图片 图片 它支持 70多种语言 和 多角色自然对话 ,并通过自动标签功能简化创作,有望在 影视配音 、 虚拟助手 等领域广泛应用,重新定义 AI 语音 的未来。 AI前沿研究 这篇研究论文介绍了一种名为 动态内存稀疏化(DMS) 的新方法,它通过压缩 Transformer LLM 的 KV 缓存 ,在推理时实现 超扩展 ,从而在相同计算资源下生成更多 Token 并提高模型准确性。该方法仅需少量训练步骤即可实现高压缩率,并显著提升了如 Qwen-R1 32B 等多种 LLM 在 AIME 24 、 GPQA 和 LiveCodeBench 等基准测试上的准确性。论文地址: https://arxiv.org/abs/2506.05345 。 AI行业展望与社会影响 宇树科技 CEO 王兴兴 在第七届 北京智源大会 上表示,公司始终坚持的终极目标是让 机器人 实现家庭和工业场景的 实用化工作 ,而跳舞和格斗等具身智能展示仅是训练和技术验证的手段。 图片 他透露,今年上半年 人形机器人 在商业租赁市场已初具规模并带来可观价值,未来将加速机器人实用化落地。 知名科技博主 王自如 在 B站 宣布复更,并正式更名为\\" 王自如AI ”,表示将以 AI 测评 UP 主 的身份开启二次创业,专注于 AI 内容创业 和 AI 应用 ,助力传统产业数字化转型。 图片 他在视频中感谢了 董明珠 和 雷军 的鼓励和帮助,并提及此前入职格力是为重塑销售体系。 开源TOP项目 note-gen 是一款 AI 赋能 的跨平台 Markdown 笔记应用 (Stars: 3161),致力于利用 AI 将碎片化知识整理成可读笔记,连接记录与写作。项目地址: https://github.com/codexu/note-gen 。 notebooks 项目(Stars: 1174)提供了通过 Google Colab 、 Kaggle 等平台引导式 Notebook 免费微调 大型语言模型 的功能。项目地址: https://github.com/unslothai/notebooks 。 ragbits (Stars: 749)提供了一系列构建模块,旨在帮助开发者快速开发 生成式 AI 应用程序 。项目地址: https://github.com/deepsense-ai/ragbits 。 社媒分享 知名博主 歸藏 推荐 即梦AI 图片3.0的 智能参考 功能,该功能支持用户基于上传图像生成任何内容,并能修改照片背景、添加配饰、更改姿势,甚至精确添加或修改复杂 文字效果 。 Image 这一突破性能力极大地提升了日常照片分享的表现力,并能高效生成电商产品图、小红书和视频封面等 营销物料 。文章链接: https://mp.weixin.qq.com/s/_kt9OLylR95sG7U37wseSw ,社交媒体链接: https://m.okjike.com/originalPosts/6842cd91a26304532600fa4d 。 Yangyi 分享了 AI 时代 的产品价值公式,指出产品价值取决于\\" 新体验 ”(获得有效结果与美观度)和\\" 迁移成本 ”(旧平台数据沉没成本与上手门槛)之间的差异。因此,构建高价值 AI 产品 需要提供超预期的有效结果、足够美观的界面,并致力于降低用户数据迁移的难度和产品的使用门槛。社交媒体链接: https://x.com/Yangyixxxx/status/1930912029809979654 。","breadcrumbs":"06-07-日刊 » AI洞察日报 2025/6/7","id":"5","title":"AI洞察日报 2025/6/7"},"6":{"body":"AI产品与功能更新 Pollo AI 推出了一站式 AI图像与视频生成平台 ,整合全球前沿模型如Google Veo 3、Kling等,提供文字转视频、图像风格化、角色一致性等多种功能,并支持API接入,相比同类平台更具成本和模型优势,且获得Google Cloud的Veo 3模型授权。 图片 Luma Labs 发布了全新的 AI视频编辑工具 Modify Video,基于其Dream Machine平台和 Ray2模型 ,用户能通过文本提示对视频进行风格重塑、场景替换和角色调整,大幅降低了传统视频制作的复杂性和成本。该工具凭借Ray2模型的强大能力,在动作流畅性和时间一致性方面表现出色,并降低了创意门槛。 图片 谷歌更新了 Gemini 2.5版本 ,显著提升了 AI音频对话与生成技术 ,使其成为一个能够原生理解和生成文本、图像、音频、视频和代码的多模态AI系统。新功能使得人机交流更加自然流畅,支持实时音频对话、风格控制和多语言,并通过可控的文本转语音技术,允许用户精确调整语音输出的语调和情感。 图片 热门手游《 逆水寒 》与 可灵AI 合作,在游戏内推出了全新的\\" 图生动图 ”玩法,让玩家能够通过简单操作将静态图片转化为个性化动态画面。该功能支持用户截图或上传图片,通过输入描述词来生成动图,并可进行双人互动创作,提升了玩家的游戏体验。 图片 AI前沿研究 NVIDIA 发布了 Llama-3.1-Nemotron-Nano-VL-8B-V1 ,这是一款基于Llama-3.1架构的 8B参数视觉语言模型 ,支持图像、视频和文本输入,并能输出高质量文本及具备强大的图像推理能力。该模型在OCR和文档智能方面表现卓越,通过AWQ4bit量化技术可在单张RTX GPU上高效部署,并已在Hugging Face平台开源,为开发者提供了轻量高效的多模态AI解决方案。 图片 Voyager 是一种新颖的 视频扩散框架 ,它能从单张图片和用户定义的摄像机路径,生成 世界一致的3D点云序列 ,特别适用于游戏和虚拟现实中可探索的3D场景。这项技术通过联合生成对齐的RGB和深度视频序列,实现了帧间固有的 3D一致性 ,显著提升了视觉质量和几何精度。论文地址: https://arxiv.org/abs/2506.04225 AI行业展望与社会影响 硅谷投资人 Mary Meeker 的最新 AI报告 指出,全球AI竞争格局正经历深刻重塑,中国AI力量与 开源浪潮 正全面崛起,挑战OpenAI等头部公司的主导地位。报告强调,中国AI模型性能已逼近国际一线,并在制造业中展现出强大的产业融合能力,同时开源模型凭借低成本和高灵活性,市场份额迅速增长,预示着AI行业进入多极对抗新时代。 图片 开源TOP项目 netbird 是一个拥有 14029 颗星的 开源项目 ,它基于 WireGuard® 帮助用户将设备连接到安全的覆盖网络,并支持 SSO 、 MFA 和精细的访问控制,提供安全高效的网络连接。项目地址: https://github.com/netbirdio/netbird quarkdown 是一个拥有 3952 颗星的 开源项目 ,旨在为 Markdown 文本赋予\\"超能力”,将想法轻松转化为演示文稿、文章和书籍等多种形式。项目地址: https://github.com/iamgio/quarkdown cognee 是一个拥有 2658 颗星的 开源项目 ,其核心功能是仅用 5 行代码 即可实现 AI 智能体的记忆 ,极大简化了智能体开发中的复杂性。项目地址: https://github.com/topoteretes/cognee 社媒分享 @wwwyesterday 分享了一个关于与 AI 对话 的\\"生活小妙招”,即在开始时让AI每次回复都称呼\\"哥哥”,一旦AI停止这样称呼,就意味着可以新开对话窗口了。这个小技巧巧妙地利用了AI的\\"记忆”机制,为用户提供了判断对话是否需要重新开始的依据。 Gorden Sun 宣布 Fish Audio 已开源其 S1-mini语音模型 ,作为表现良好的S1模型的精简版(0.5B参数)。S1-mini可供个人免费部署使用,但不可商用。在线体验及模型链接: https://huggingface.co/spaces/fishaudio/openaudio-s1-mini https://huggingface.co/fishaudio/openaudio-s1-mini 。","breadcrumbs":"06-06-日刊 » AI洞察日报 2025/6/6","id":"6","title":"AI洞察日报 2025/6/6"},"7":{"body":"AI产品与功能更新 Suno 近日升级了其 AI音乐编辑工具 ,允许用户上传和混音未完成的作品,并能修改歌词和延长曲目时长至八分钟,同时引入了创意滑块等功能。 图片 此次升级正值其面临主要唱片公司的版权诉讼,唱片公司希望引入类似于 YouTube Content ID 的技术来追踪 AI 平台上的音乐使用情况。 OpenAI 近日宣布 ChatGPT 升级新功能,现可连接 Outlook 、 Teams 、 Gmail 等多个外部服务,旨在提升企业用户的协作和信息获取效率。 图片 此外, macOS 版 ChatGPT Team 用户还新增了\\" 录制模式 ”,能自动生成会议记录和待办事项。 AI驱动的代码编辑器 Cursor 于近日正式发布1.0版本,引入了核心功能 BugBot ,能自动化审查 GitHub 上的 Pull Request 并一键修复代码。 图片 该版本还全面开放了后台代理功能,并增加了 Jupyter 支持和\\"Memories”项目管理功能,旨在显著提升开发者的生产力。 腾讯公益近日推出了创新性的\\" 问 AI ”功能,首次将 大型人工智能模型 应用于公益领域,旨在提升公众与公益项目及机构之间的互动和透明度。 图片 这一便捷的沟通方式有助于公众更深入地理解并参与公益事业,并有望推动公益事业的进一步发展。 AI前沿研究 这项研究提出 SuperWriter-Agent 框架,通过引入结构化的思考、规划和完善阶段,显著提升了 大型语言模型 在生成长文本时的连贯性和质量。 基于此框架训练的 SuperWriter-LM 在多项基准测试中表现出领先水平,证明了这种反思驱动方法能够让模型像专业作家一样,生成更高质量和一致性的长篇内容: Link 。 AI行业展望与社会影响 OpenAI 首席执行官 山姆・奥尔特曼 指出, AI 正逐渐被企业视为基层员工,导致科技公司初级职位招聘量在2023至2024年间下降了25%。 图片 专家预测,到2030年 AI 可能取代多达3.75亿个工作岗位,甚至未来1到5年内可能淘汰一半的初级白领岗位,引发高达20%的失业率。 开源TOP项目 HowToCook 是一个专为程序员设计的居家烹饪方法指南,旨在解决程序员做饭难的问题。该项目目前已获得 87530 个 Star ,内容仅限简体中文,提供详细的烹饪指导: Link 。 system-design-primer 是一项旨在帮助学习如何设计大规模系统并准备系统设计面试的开源项目,已获得 304096 个 Star 。它提供了全面的学习资源,并包含 Anki 抽认卡辅助学习: Link 。 ChinaTextbook 项目致力于收集中国所有小学、初中、高中及大学的 PDF教材 ,为学生和教师提供免费的教育资源。这个实用的资料库已获得 35875 个 Star : Link 。 Firecrawl 近日发布了突破性的 /search API ,允许开发者通过一次API调用实现网页搜索与内容抓取,并以 AI友好 的多种格式输出数据。 图片 这一功能极大简化了 AI 应用的数据获取流程,无需第三方依赖,提升了数据处理效率,并在 GitHub 上已获得超过10K的 Star 。 社媒分享 Gorden Sun 分享了一套能生成\\"超级赞”图文效果的 AI 提示词,并推荐使用 GPT4o 、 Claude-3.7 和 DeepSeek-V3 等工具。 Image 他指出,这些提示词虽然易于使用,但原作者在整理上花费了心思: Link 。 推主 wwwyesterday 将现代学术论文比作 npm 包管理系统,认为两者都存在论文/包数量庞大、引用/依赖层层叠叠的现象,且大部分价值不高,少数经典广为引用。 他指出,现在很少有人能完全从零开始原创,就像写东西离不开 package.json,但他仍会刷 arxiv 寻找新观点: Link 。","breadcrumbs":"06-05-日刊 » AI洞察日报 2025/6/5","id":"7","title":"AI洞察日报 2025/6/5"},"8":{"body":"AI产品与功能更新 Komiko平台近日推出 视频到视频 功能,利用AI技术将用户上传的视频一键转换为 动漫 、漫画等多样化艺术风格的动态内容,极大降低了动画创作的门槛。该功能通过深度整合先进AI模型,并提供AI线稿上色、动画补帧等工具,旨在加速创意产业的数字化转型,成为专业人士和爱好者的 首选 创作工具。 图片 蚂蚁集团的**\\"AI健康管家” 成功通过信通院医疗健康行业大模型 可信评估**,成为首批获认可的产品之一,进一步提升了其在医疗AI领域的 可靠性 。该产品已服务超 4000万用户 ,提供预约医生、健康评估、报告解读等 智能健康服务 ,并吸引了60多位知名医生AI智能体入驻,未来将持续扩展功能。 图片 AI前沿研究 AI\\"教父” 约书亚・本吉奥 成立非营利组织 LawZero ,投入3000万美元启动资金,旨在开发**\\"科学家 AI” 系统以防范未来AI智能体对人类进行欺骗。该系统将作为AI安全监控的 护栏**,确保自身智能程度与所监管AI智能体相当,通过提高AI的 透明性和可信性 ,推动行业向更负责任的方向发展。 图片 Play AI开源发布了 PlayDiffusion ,一款基于扩散模型的语音**\\"局部修改” 工具,能够实现对音频片段的替换、删除或调整而 不留痕迹**,极大提升了音频编辑效率和自然度。该技术能以高达50倍的速度提升 TTS推理效率 ,并保持全局一致性,对播客制作、AI配音和内容纠错等场景具有 重要意义 ,有望成为内容创作的必备利器。 GitHub: PlayDiffusion 模型下载: PlayDiffusion LumosFlow是一个用于 长视频生成 的新框架,它通过引入 运动引导 来解决现有方法中时间连贯性不足和过渡不自然的问题。该研究通过分层生成关键帧并分解中间帧插值,实现了高达 15倍的插值 ,确保了生成视频的 运动和外观一致性 。 论文URL: LumosFlow AI行业展望与社会影响 OpenAI以30亿美元收购 Windsurf 后,用户对其 Claude模型访问权限 大幅受限,引发开发者普遍不满,严重影响了开发效率与用户体验。此举导致Windsurf用户面临 成本增加 和操作复杂性,且未能获得Claude4系列直接访问,这可能威胁Windsurf在激烈市场竞争中的 未来增长 。 图片 开源TOP项目 RedditVideoMakerBot (⭐7672) 是一个开源项目,旨在通过 一条命令 简化Reddit视频的创建过程,极大地降低了用户制作视频的门槛。 项目URL: RedditVideoMakerBot cursor-free-vip (⭐28687) 是一款专为 Cursor AI 设计的工具,能够自动重置机器ID,从而 免费升级 并绕过其Pro功能中的 高代币限制 和试用请求限制。该项目有效解决了用户在Cursor AI使用过程中遇到的 免费试用账户限制 问题。 项目URL: cursor-free-vip 科技博主观点 科技博主 大帅老猿 指出,通过 重新讲述 学到的知识并录制视频来卖课是常见操作,但 标榜原创 的行为只可能欺骗新手。他强调检验原创的 唯一真理 是 举报 、投诉、打官司,只有能让侵权内容下架或获得赔偿,才有资格自称原创。 Tweet Link 博主 ginobefun 推荐了一篇关于 复杂RAG架构演进 的InfoQ文章,该文章深入探讨了 跨模态知识联邦 与 统一语义推理 的实践。文章提出通过 融合知识库 和 统一知识图谱 解决传统RAG在处理异构、多模态知识时的挑战,并通过医疗和金融案例展示了其 应用价值 。 图片 图片 图片 文章链接: 文章","breadcrumbs":"06-04-日刊 » AI洞察日报 2025年6月4日","id":"8","title":"AI洞察日报 2025年6月4日"},"9":{"body":"AI产品与功能更新 谷歌近日在美国地区推出了 Gemini Live 功能,正式登陆 iOS 和 iPadOS 平台,用户可通过 Gemini App 免费体验 AI 识别场景和屏幕内容的便捷。这项创新不仅提升了用户互动体验,也预示着 AI 技术正进一步融入日常生活,成为人们的智能助手。 图片 微软最新推出了免费的 Bing Video Creator 工具,基于 OpenAI Sora 技术,让用户通过简单的文字提示即可轻松创作短视频。这款工具已在全球范围内的必应移动应用中上线,极大降低了视频创作的门槛,有望丰富用户的创作体验。 图片 新加坡国立大学(NUS)团队近日发布了 OmniConsistency 项目,它以极低成本复现了 GPT-4o 在图像风格化上的一致性,解决了开源社区的风格化难题。该项目通过独特的学习框架和模块化架构,有望成为图像生成领域的重要工具,推动 AI 艺术创作。 图片 AI前沿研究 WebChoreArena ( Link ) 提出了一个包含 532 项精心策划任务的全新基准,旨在评估 LLM 驱动的网页浏览代理处理繁琐复杂网页任务的能力。研究发现,尽管 GPT-4o 等先进大模型在此基准上表现出显著进步,但相较于通用网页任务,仍有巨大的提升空间,凸显了处理复杂**\\"网络杂务”**的挑战性。 RoboMaster ( Link ) 提出了一种创新的机器人操作视频生成框架,它通过协作轨迹建模和阶段性分解交互过程,有效解决了多目标交互中视觉保真度下降的问题。这项技术成功地实现了 机器人操作 中视频生成质量的新突破,为复杂场景下的 轨迹控制 提供了更精准的解决方案。 AI行业展望与社会影响 近日,美国犹他州律师理查德・贝德纳因在法庭文件中引用 ChatGPT 生成的虚假案例,被法院处以罚款,再次引发了对 AI 在法律领域应用的广泛争议。此事件深刻提醒法律从业者,在使用新兴技术时,务必保持严谨的 审核责任 ,确保法律文件的准确性。 图片 OpenAI 计划在2025年上半年将 ChatGPT 打造为具备 T 型技能 的\\" 超级助手 ”,旨在挑战苹果 Siri 的市场地位。这份战略文件透露, OpenAI 不仅希望 ChatGPT 成为能处理日常琐事和复杂任务的智能伙伴,更呼吁用户能在所有平台上自由选择默认 AI 助手,推动 AI 市场更加开放。 开源TOP项目 nautilus_trader ( Link ) 是一个拥有 6728 Star 的 高性能算法交易平台 和 事件驱动回测器 ,为开发者提供强大的交易策略验证能力。 data-engineer-handbook ( Link ) 拥有 28669 Star ,是一个旨在帮助用户学习 数据工程 的综合性资源仓库,汇集了所有相关学习链接。 postiz-app ( Link ) 是一个坐拥 20460 Star 的 终极社交媒体日程安排工具 ,集成了大量 AI 功能,旨在简化社交媒体管理。","breadcrumbs":"06-03-日刊 » AI洞察日报 2025年6月3日","id":"9","title":"AI洞察日报 2025年6月3日"}},"length":12,"save":true},"fields":["title","body","breadcrumbs"],"index":{"body":{"root":{"1":{".":{"0":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"0":{"/":{"1":{"1":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"4":{"3":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"4":{"2":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"8":{"5":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"11":{"tf":1.0}},"k":{"df":1,"docs":{"7":{"tf":1.0}}}},"1":{"7":{"4":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"5":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"9":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}},"5":{"5":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"8":{"4":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"4":{"8":{"3":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"2":{"tf":1.0}}},"4":{"0":{"2":{"9":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"3":{"tf":1.0}}},"1":{"7":{"0":{"df":0,"docs":{},"个":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"8":{"tf":1.0}}},"7":{"0":{"0":{"2":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"9":{"9":{"2":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"9":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"7":{"7":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"2":{".":{"5":{"df":3,"docs":{"2":{"tf":1.7320508075688772},"5":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"0":{"2":{"5":{"/":{"6":{"/":{"1":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"1":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"7":{"tf":1.0}}},"6":{"df":1,"docs":{"6":{"tf":1.0}}},"7":{"df":1,"docs":{"5":{"tf":1.0}}},"8":{"df":1,"docs":{"4":{"tf":1.0}}},"9":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"2":{"tf":1.0},"9":{"tf":1.0}},"大":{"df":0,"docs":{},"会":{"df":0,"docs":{},"上":{"df":0,"docs":{},"带":{"df":0,"docs":{},"来":{"df":0,"docs":{},"了":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}}}}}},"年":{"6":{"df":0,"docs":{},"月":{"1":{"df":1,"docs":{"11":{"tf":1.0}}},"2":{"df":1,"docs":{"10":{"tf":1.0}}},"3":{"df":1,"docs":{"9":{"tf":1.0}}},"4":{"df":1,"docs":{"8":{"tf":1.0}}},"5":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"4":{"6":{"0":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"11":{"tf":1.0}}},"2":{"0":{"df":0,"docs":{},"倍":{"df":0,"docs":{},"、":{"df":0,"docs":{},"常":{"df":0,"docs":{},"规":{"5":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"5":{"tf":1.0}}},"6":{"0":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"5":{"8":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"8":{"6":{"6":{"9":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"8":{"7":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"4":{"0":{"df":0,"docs":{},"个":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"5":{"tf":1.0}}},"1":{"df":1,"docs":{"6":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"9":{"6":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"11":{"tf":1.0}}},"1":{"6":{"1":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"9":{"4":{"1":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"5":{"8":{"7":{"5":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"5":{"2":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":1,"docs":{"2":{"tf":1.0}}},"d":{"df":2,"docs":{"5":{"tf":1.0},"6":{"tf":1.4142135623730951}}},"df":3,"docs":{"2":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}},"管":{"df":0,"docs":{},"理":{"df":0,"docs":{},"后":{"df":0,"docs":{},"台":{"df":0,"docs":{},"模":{"df":0,"docs":{},"板":{"df":0,"docs":{},",":{"df":0,"docs":{},"它":{"df":0,"docs":{},"采":{"df":0,"docs":{},"用":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"4":{"tf":1.0}}}}}}}}}}}}}}}}},"4":{".":{"0":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"0":{"%":{"df":0,"docs":{},")":{"df":0,"docs":{},"与":{"df":0,"docs":{},"人":{"df":0,"docs":{},"类":{"df":0,"docs":{},"(":{"9":{"7":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"6":{"9":{"df":0,"docs":{},"个":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"的":{"df":0,"docs":{},"项":{"df":0,"docs":{},"目":{"df":0,"docs":{},",":{"df":0,"docs":{},"它":{"df":0,"docs":{},"为":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}},"5":{"3":{"2":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"2":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"6":{"7":{"2":{"8":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"月":{"5":{"df":1,"docs":{"4":{"tf":1.0}}},"6":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{}}},"7":{"0":{"1":{"8":{"df":0,"docs":{},"个":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"8":{"6":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"5":{"tf":1.0}}},"2":{"5":{"7":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"6":{"0":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"9":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"6":{"7":{"2":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"7":{"5":{"3":{"0":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":1,"docs":{"6":{"tf":1.4142135623730951}},"稀":{"df":0,"docs":{},"疏":{"df":0,"docs":{},"版":{"df":0,"docs":{},"和":{"0":{".":{"5":{"b":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"9":{"df":0,"docs":{},"款":{"df":0,"docs":{},"模":{"df":0,"docs":{},"型":{"df":0,"docs":{},",":{"df":0,"docs":{},"已":{"df":0,"docs":{},"在":{"df":0,"docs":{},"魔":{"df":0,"docs":{},"搭":{"df":0,"docs":{},"社":{"df":0,"docs":{},"区":{"df":0,"docs":{},"、":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"4":{"tf":1.0}}}}}}}}}}}}}}}}},"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"2":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}},"i":{"/":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":12,"docs":{"0":{"tf":3.4641016151377544},"1":{"tf":3.4641016151377544},"10":{"tf":3.4641016151377544},"11":{"tf":4.0},"2":{"tf":4.0},"3":{"tf":2.6457513110645907},"4":{"tf":3.0},"5":{"tf":4.69041575982343},"6":{"tf":3.4641016151377544},"7":{"tf":3.605551275463989},"8":{"tf":3.3166247903554},"9":{"tf":3.3166247903554}},"m":{"df":1,"docs":{"5":{"tf":1.0}}},"竞":{"df":0,"docs":{},"争":{"df":0,"docs":{},"格":{"df":0,"docs":{},"局":{"df":0,"docs":{},"正":{"df":0,"docs":{},"经":{"df":0,"docs":{},"历":{"df":0,"docs":{},"深":{"df":0,"docs":{},"刻":{"df":0,"docs":{},"重":{"df":0,"docs":{},"塑":{"df":0,"docs":{},",":{"df":0,"docs":{},"中":{"df":0,"docs":{},"国":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"10":{"tf":1.0}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"在":{"df":0,"docs":{},"x":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":2.0}}}}}}}},"p":{"df":0,"docs":{},"i":{"df":2,"docs":{"2":{"tf":1.7320508075688772},"7":{"tf":1.0}}},"p":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"5":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":1,"docs":{"4":{"tf":1.0}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"2":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"df":1,"docs":{"5":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"9":{"tf":1.0}}}},"t":{"df":1,"docs":{"4":{"tf":1.0}}}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"p":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"2":{"tf":1.0}},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"5":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"g":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"2":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"u":{"d":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.7320508075688772},"2":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"的":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"6":{"tf":1.0}}}}},"l":{"a":{"b":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"2":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"y":{"df":0,"docs":{},"分":{"df":0,"docs":{},"享":{"df":0,"docs":{},"了":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"7":{"tf":1.0},"8":{"tf":2.0}}}}}}}},"d":{"/":{"a":{"c":{"c":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":1,"docs":{"10":{"tf":1.0}},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"4":{"tf":1.0},"7":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"m":{"df":1,"docs":{"5":{"tf":1.0}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"1":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}},"l":{"a":{"b":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"3":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"f":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"6":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"df":2,"docs":{"2":{"tf":1.0},"3":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"u":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":4,"docs":{"2":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"n":{"a":{"df":0,"docs":{},"i":{"_":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"10":{"tf":1.0},"5":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"8":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0}}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":3,"docs":{"2":{"tf":1.7320508075688772},"5":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"q":{"a":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"t":{"4":{"df":0,"docs":{},"o":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":2,"docs":{"3":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"上":{"df":0,"docs":{},"高":{"df":0,"docs":{},"效":{"df":0,"docs":{},"部":{"df":0,"docs":{},"署":{"df":0,"docs":{},",":{"df":0,"docs":{},"并":{"df":0,"docs":{},"已":{"df":0,"docs":{},"在":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}}}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"11":{"tf":1.7320508075688772}}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"a":{"b":{"df":0,"docs":{},"s":{"/":{"2":{"5":{"0":{"5":{".":{"1":{"7":{"6":{"1":{"8":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"4":{"2":{"2":{"5":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"2":{"1":{"8":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"4":{"5":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"u":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"m":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"j":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"6":{"8":{"4":{"2":{"c":{"d":{"9":{"1":{"a":{"2":{"6":{"3":{"0":{"4":{"5":{"3":{"2":{"6":{"0":{"0":{"df":0,"docs":{},"f":{"a":{"4":{"d":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"q":{"df":0,"docs":{},"q":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"s":{"/":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"9":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"9":{"5":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"7":{"df":0,"docs":{},"u":{"3":{"7":{"df":0,"docs":{},"w":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}}}}},"x":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"y":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"x":{"df":0,"docs":{},"x":{"df":0,"docs":{},"x":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"/":{"1":{"9":{"3":{"0":{"9":{"1":{"2":{"0":{"2":{"9":{"8":{"0":{"9":{"9":{"7":{"9":{"6":{"5":{"4":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"2":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}}}}}}}}},"df":0,"docs":{}}}},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}}}}}}},"d":{"df":3,"docs":{"11":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"5":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"q":{"df":1,"docs":{"8":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":2,"docs":{"2":{"tf":1.0},"9":{"tf":1.0}}},"p":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"z":{"df":0,"docs":{},"x":{"df":1,"docs":{"3":{"tf":1.0}}}}},"j":{"a":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"k":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}}}},"v":{"df":1,"docs":{"5":{"tf":1.0}}}},"l":{"a":{"b":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"11":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"8":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"2":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":9,"docs":{"0":{"tf":2.6457513110645907},"1":{"tf":2.6457513110645907},"10":{"tf":2.6457513110645907},"2":{"tf":2.6457513110645907},"3":{"tf":3.1622776601683795},"4":{"tf":2.0},"7":{"tf":2.449489742783178},"8":{"tf":1.0},"9":{"tf":2.23606797749979}}}},"v":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"9":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"6":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":4,"docs":{"10":{"tf":1.0},"2":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":1,"docs":{"7":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"u":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}}}}}}}},"m":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"6":{"tf":1.0}}}}},"o":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"5":{"tf":1.0},"6":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"2":{"tf":1.0}}}}},"f":{"a":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"m":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":1,"docs":{"6":{"tf":1.7320508075688772}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":1,"docs":{"10":{"tf":1.0}},"l":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"11":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"n":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"p":{"4":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}},"t":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"5":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"m":{"df":1,"docs":{"7":{"tf":1.0}}}},"u":{"df":1,"docs":{"9":{"tf":1.0}}},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"3":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}}}}}},"df":1,"docs":{"3":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":4,"docs":{"2":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}},"以":{"3":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"10":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"f":{"df":2,"docs":{"11":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"11":{"tf":1.7320508075688772},"5":{"tf":1.7320508075688772}}}}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"x":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}}}}},"l":{"a":{"df":0,"docs":{},"y":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"8":{"tf":1.7320508075688772}}}}}}}},"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":1,"docs":{"4":{"tf":1.0}},"s":{"df":0,"docs":{},"订":{"df":0,"docs":{},"阅":{"df":0,"docs":{},"即":{"df":0,"docs":{},"可":{"df":0,"docs":{},"使":{"df":0,"docs":{},"用":{"df":0,"docs":{},"的":{"df":0,"docs":{},"免":{"df":0,"docs":{},"费":{"df":0,"docs":{},"g":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}}}}}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"或":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"f":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"5":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"o":{"df":7,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"11":{"tf":1.0},"2":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"8":{"tf":1.0}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"11":{"tf":1.0},"3":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"3":{"df":1,"docs":{"4":{"tf":1.0}}},"df":1,"docs":{"5":{"tf":1.0}}}}}},"r":{"1":{"df":1,"docs":{"5":{"tf":1.0}}},"a":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":4,"docs":{"11":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.4142135623730951},"8":{"tf":1.0}}},"y":{"2":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"l":{"df":2,"docs":{"10":{"tf":1.0},"11":{"tf":1.0}}},"o":{"b":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"2":{".":{"0":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"2":{".":{"0":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"1":{"df":1,"docs":{"6":{"tf":1.7320508075688772}},"模":{"df":0,"docs":{},"型":{"df":0,"docs":{},"的":{"df":0,"docs":{},"精":{"df":0,"docs":{},"简":{"df":0,"docs":{},"版":{"df":0,"docs":{},"(":{"0":{".":{"5":{"b":{"df":0,"docs":{},"参":{"df":0,"docs":{},"数":{"df":0,"docs":{},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"d":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":1,"docs":{"5":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"9":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"t":{"a":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"5":{"tf":1.7320508075688772},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":3,"docs":{"10":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}},"o":{"df":1,"docs":{"7":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}}}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"t":{"df":1,"docs":{"9":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}}}}},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}},"p":{"df":11,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"5":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"5":{"tf":1.0},"8":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"w":{"9":{"3":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"i":{"df":2,"docs":{"2":{"tf":1.0},"5":{"tf":1.0}}},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":1,"docs":{"5":{"tf":1.0}}},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.7320508075688772}}}}},"v":{"1":{"df":1,"docs":{"6":{"tf":1.0}}},"3":{"df":2,"docs":{"5":{"tf":1.0},"7":{"tf":1.0}}},"4":{".":{"5":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}},"i":{"b":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"3":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"9":{"tf":1.0}},",":{"df":0,"docs":{},"基":{"df":0,"docs":{},"于":{"df":0,"docs":{},"其":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"p":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"l":{"df":1,"docs":{"6":{"tf":1.0}},"m":{"df":1,"docs":{"10":{"tf":1.0}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"2":{"tf":1.0}}}},"y":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}},"q":{"a":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"4":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"b":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"2":{"tf":1.0}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"w":{"d":{"c":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"d":{"a":{"df":0,"docs":{},"y":{"df":2,"docs":{"6":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"x":{"a":{"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":2,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.4142135623730951}}},"y":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"y":{"df":0,"docs":{},"i":{"df":2,"docs":{"3":{"tf":1.0},"5":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}}}}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"10":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}}}}},"breadcrumbs":{"root":{"0":{"1":{"df":1,"docs":{"11":{"tf":1.0}}},"2":{"df":1,"docs":{"10":{"tf":1.0}}},"3":{"df":1,"docs":{"9":{"tf":1.0}}},"4":{"df":1,"docs":{"8":{"tf":1.0}}},"5":{"df":1,"docs":{"7":{"tf":1.0}}},"6":{"df":11,"docs":{"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.4142135623730951},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}},"7":{"df":1,"docs":{"5":{"tf":1.0}}},"8":{"df":1,"docs":{"4":{"tf":1.0}}},"9":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"1":{".":{"0":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"0":{"/":{"1":{"1":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"4":{"3":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"4":{"2":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"7":{"8":{"5":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"11":{"tf":1.0},"2":{"tf":1.0}},"k":{"df":1,"docs":{"7":{"tf":1.0}}}},"1":{"7":{"4":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"1":{"tf":1.0}}},"2":{"5":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"7":{"2":{"9":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}},"5":{"5":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"8":{"4":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"4":{"8":{"3":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"2":{"tf":1.0}}},"4":{"0":{"2":{"9":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"0":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"0":{"df":1,"docs":{"3":{"tf":1.0}}},"1":{"7":{"0":{"df":0,"docs":{},"个":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"8":{"tf":1.0}}},"7":{"0":{"0":{"2":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"1":{"9":{"9":{"2":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"9":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"7":{"7":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"2":{".":{"5":{"df":3,"docs":{"2":{"tf":1.7320508075688772},"5":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{}},"0":{"2":{"5":{"/":{"6":{"/":{"1":{"0":{"df":1,"docs":{"2":{"tf":1.4142135623730951}}},"1":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}},"6":{"df":1,"docs":{"6":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}},"8":{"df":1,"docs":{"4":{"tf":1.4142135623730951}}},"9":{"df":1,"docs":{"3":{"tf":1.4142135623730951}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"2":{"tf":1.0},"9":{"tf":1.0}},"大":{"df":0,"docs":{},"会":{"df":0,"docs":{},"上":{"df":0,"docs":{},"带":{"df":0,"docs":{},"来":{"df":0,"docs":{},"了":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}}}}}},"年":{"6":{"df":0,"docs":{},"月":{"1":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}},"2":{"df":1,"docs":{"10":{"tf":1.4142135623730951}}},"3":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}},"4":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}},"5":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"3":{"0":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"4":{"6":{"0":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"11":{"tf":1.0}}},"2":{"0":{"df":0,"docs":{},"倍":{"df":0,"docs":{},"、":{"df":0,"docs":{},"常":{"df":0,"docs":{},"规":{"5":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"4":{"df":1,"docs":{"5":{"tf":1.0}}},"6":{"0":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"5":{"8":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"8":{"6":{"6":{"9":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"8":{"7":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"4":{"0":{"df":0,"docs":{},"个":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{".":{"0":{"df":1,"docs":{"5":{"tf":1.0}}},"1":{"df":1,"docs":{"6":{"tf":1.4142135623730951}}},"7":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"0":{"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"4":{"0":{"9":{"6":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":1,"docs":{"11":{"tf":1.0}}},"1":{"6":{"1":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"2":{"9":{"4":{"1":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"5":{"8":{"7":{"5":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"9":{"5":{"2":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":1,"docs":{"2":{"tf":1.0}}},"d":{"df":2,"docs":{"5":{"tf":1.0},"6":{"tf":1.4142135623730951}}},"df":3,"docs":{"2":{"tf":1.0},"4":{"tf":1.0},"6":{"tf":1.0}},"管":{"df":0,"docs":{},"理":{"df":0,"docs":{},"后":{"df":0,"docs":{},"台":{"df":0,"docs":{},"模":{"df":0,"docs":{},"板":{"df":0,"docs":{},",":{"df":0,"docs":{},"它":{"df":0,"docs":{},"采":{"df":0,"docs":{},"用":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":1,"docs":{"4":{"tf":1.0}}}}}}}}}}}}}}}}},"4":{".":{"0":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"0":{"%":{"df":0,"docs":{},")":{"df":0,"docs":{},"与":{"df":0,"docs":{},"人":{"df":0,"docs":{},"类":{"df":0,"docs":{},"(":{"9":{"7":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"0":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"6":{"9":{"df":0,"docs":{},"个":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"的":{"df":0,"docs":{},"项":{"df":0,"docs":{},"目":{"df":0,"docs":{},",":{"df":0,"docs":{},"它":{"df":0,"docs":{},"为":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"o":{"df":1,"docs":{"9":{"tf":1.4142135623730951}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}},"5":{"3":{"2":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":2,"docs":{"2":{"tf":1.4142135623730951},"6":{"tf":1.0}}},"6":{"7":{"2":{"8":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"月":{"5":{"df":1,"docs":{"4":{"tf":1.0}}},"6":{"df":2,"docs":{"3":{"tf":1.0},"4":{"tf":1.0}}},"df":0,"docs":{}}},"7":{"0":{"1":{"8":{"df":0,"docs":{},"个":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"r":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"8":{"6":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"df":1,"docs":{"5":{"tf":1.0}}},"2":{"5":{"7":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"6":{"0":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"4":{"9":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"6":{"7":{"2":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"8":{"7":{"5":{"3":{"0":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"b":{"df":1,"docs":{"6":{"tf":1.4142135623730951}},"稀":{"df":0,"docs":{},"疏":{"df":0,"docs":{},"版":{"df":0,"docs":{},"和":{"0":{".":{"5":{"b":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"9":{"df":0,"docs":{},"款":{"df":0,"docs":{},"模":{"df":0,"docs":{},"型":{"df":0,"docs":{},",":{"df":0,"docs":{},"已":{"df":0,"docs":{},"在":{"df":0,"docs":{},"魔":{"df":0,"docs":{},"搭":{"df":0,"docs":{},"社":{"df":0,"docs":{},"区":{"df":0,"docs":{},"、":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"4":{"tf":1.0}}}}}}}}}}}}}}}}},"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":3,"docs":{"10":{"tf":1.0},"2":{"tf":1.4142135623730951},"7":{"tf":1.0}}}}}},"i":{"/":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"g":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":12,"docs":{"0":{"tf":3.605551275463989},"1":{"tf":3.605551275463989},"10":{"tf":3.605551275463989},"11":{"tf":4.123105625617661},"2":{"tf":4.123105625617661},"3":{"tf":2.8284271247461903},"4":{"tf":3.1622776601683795},"5":{"tf":4.795831523312719},"6":{"tf":3.605551275463989},"7":{"tf":3.7416573867739413},"8":{"tf":3.4641016151377544},"9":{"tf":3.4641016151377544}},"m":{"df":1,"docs":{"5":{"tf":1.0}}},"竞":{"df":0,"docs":{},"争":{"df":0,"docs":{},"格":{"df":0,"docs":{},"局":{"df":0,"docs":{},"正":{"df":0,"docs":{},"经":{"df":0,"docs":{},"历":{"df":0,"docs":{},"深":{"df":0,"docs":{},"刻":{"df":0,"docs":{},"重":{"df":0,"docs":{},"塑":{"df":0,"docs":{},",":{"df":0,"docs":{},"中":{"df":0,"docs":{},"国":{"a":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}}}}}}},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":1,"docs":{"10":{"tf":1.0}}}},"p":{"df":0,"docs":{},"h":{"a":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"在":{"df":0,"docs":{},"x":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"n":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":1,"docs":{"7":{"tf":1.0}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":2,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":2.0}}}}}}}},"p":{"df":0,"docs":{},"i":{"df":2,"docs":{"2":{"tf":1.7320508075688772},"7":{"tf":1.0}}},"p":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"5":{"tf":1.0},"9":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}},"t":{"df":1,"docs":{"4":{"tf":1.0}}},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"t":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"2":{"tf":1.0}}}}},"df":0,"docs":{},"l":{"a":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}}},"df":0,"docs":{}}},"b":{"df":1,"docs":{"5":{"tf":1.0}},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"9":{"tf":1.0}}}},"t":{"df":1,"docs":{"4":{"tf":1.0}}}},"l":{"a":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"f":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"3":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}}},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"4":{"tf":1.0}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"g":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{}}}},"c":{"a":{"df":0,"docs":{},"p":{"c":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":1,"docs":{"2":{"tf":1.0}},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"5":{"tf":1.0}}}},"h":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"g":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":4,"docs":{"2":{"tf":1.4142135623730951},"3":{"tf":1.4142135623730951},"7":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}}}}}}},"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"l":{"a":{"df":0,"docs":{},"u":{"d":{"df":6,"docs":{"10":{"tf":1.4142135623730951},"11":{"tf":1.7320508075688772},"2":{"tf":1.0},"4":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"的":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"o":{"b":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{}},"d":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"3":{"tf":1.0}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"6":{"tf":1.0}}}}},"l":{"a":{"b":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"m":{"df":0,"docs":{},"f":{"df":0,"docs":{},"y":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"2":{"tf":1.0}}}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"o":{"df":0,"docs":{},"k":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"11":{"tf":1.0}}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"y":{"df":0,"docs":{},"分":{"df":0,"docs":{},"享":{"df":0,"docs":{},"了":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}}}}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":2,"docs":{"7":{"tf":1.0},"8":{"tf":2.0}}}}}}}},"d":{"/":{"a":{"c":{"c":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"t":{"a":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"df":1,"docs":{"10":{"tf":1.0}},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}}}}},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":2,"docs":{"4":{"tf":1.0},"7":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"m":{"df":1,"docs":{"5":{"tf":1.0}}},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{".":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"m":{"1":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"l":{"a":{"df":0,"docs":{},"n":{"d":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}},"l":{"a":{"b":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"m":{"b":{"df":0,"docs":{},"e":{"d":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"3":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"f":{"a":{"c":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"h":{"df":1,"docs":{"6":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"x":{"df":2,"docs":{"2":{"tf":1.0},"3":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"r":{"c":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"u":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}},"df":0,"docs":{}}},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":4,"docs":{"2":{"tf":2.0},"5":{"tf":1.0},"6":{"tf":1.0},"9":{"tf":1.4142135623730951}}}}}},"n":{"a":{"df":0,"docs":{},"i":{"_":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":2,"docs":{"10":{"tf":1.0},"5":{"tf":1.4142135623730951}}}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"n":{"df":2,"docs":{"3":{"tf":1.0},"8":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{"df":6,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.4142135623730951},"11":{"tf":1.0},"7":{"tf":1.4142135623730951},"8":{"tf":1.0}}},"df":0,"docs":{}}}}},"m":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":3,"docs":{"2":{"tf":1.7320508075688772},"5":{"tf":1.4142135623730951},"6":{"tf":1.0}}}}},"r":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.4142135623730951},"6":{"tf":1.0},"7":{"tf":1.0}}}}},"df":0,"docs":{}}},"p":{"df":0,"docs":{},"q":{"a":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"t":{"4":{"df":0,"docs":{},"o":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":2,"docs":{"3":{"tf":1.0},"9":{"tf":1.4142135623730951}}},"u":{"df":0,"docs":{},"上":{"df":0,"docs":{},"高":{"df":0,"docs":{},"效":{"df":0,"docs":{},"部":{"df":0,"docs":{},"署":{"df":0,"docs":{},",":{"df":0,"docs":{},"并":{"df":0,"docs":{},"已":{"df":0,"docs":{},"在":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}}}}}}}}}},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"11":{"tf":1.7320508075688772}}}}},"h":{"a":{"df":0,"docs":{},"n":{"d":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"t":{"df":0,"docs":{},"t":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{":":{"/":{"/":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"v":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"g":{"/":{"a":{"b":{"df":0,"docs":{},"s":{"/":{"2":{"5":{"0":{"5":{".":{"1":{"7":{"6":{"1":{"8":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"6":{".":{"0":{"4":{"2":{"2":{"5":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"5":{"2":{"1":{"8":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"3":{"4":{"5":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"u":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"p":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}}}},"df":0,"docs":{},"i":{"a":{"df":0,"docs":{},"m":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}}}},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"g":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":1,"docs":{"6":{"tf":1.0}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}}}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"i":{"/":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}},"h":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"f":{"a":{"c":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"s":{"df":0,"docs":{},"p":{"a":{"c":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"/":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"m":{".":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":0,"docs":{},"j":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"l":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"s":{"/":{"6":{"8":{"4":{"2":{"c":{"d":{"9":{"1":{"a":{"2":{"6":{"3":{"0":{"4":{"5":{"3":{"2":{"6":{"0":{"0":{"df":0,"docs":{},"f":{"a":{"4":{"d":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"p":{".":{"df":0,"docs":{},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{".":{"df":0,"docs":{},"q":{"df":0,"docs":{},"q":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"s":{"/":{"_":{"df":0,"docs":{},"k":{"df":0,"docs":{},"t":{"9":{"df":0,"docs":{},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"y":{"df":0,"docs":{},"l":{"df":0,"docs":{},"r":{"9":{"5":{"df":0,"docs":{},"s":{"df":0,"docs":{},"g":{"7":{"df":0,"docs":{},"u":{"3":{"7":{"df":0,"docs":{},"w":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"w":{"df":1,"docs":{"5":{"tf":1.0}}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{}}},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"n":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"h":{"df":0,"docs":{},"r":{"df":0,"docs":{},"h":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"u":{"b":{".":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"/":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}}}}}}}}}}},"x":{".":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"/":{"df":0,"docs":{},"y":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"y":{"df":0,"docs":{},"i":{"df":0,"docs":{},"x":{"df":0,"docs":{},"x":{"df":0,"docs":{},"x":{"df":0,"docs":{},"x":{"/":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"a":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"/":{"1":{"9":{"3":{"0":{"9":{"1":{"2":{"0":{"2":{"9":{"8":{"0":{"9":{"9":{"7":{"9":{"6":{"5":{"4":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"u":{"df":0,"docs":{},"g":{"df":1,"docs":{"2":{"tf":1.0}}},"m":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"m":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}}}}}}}}},"df":0,"docs":{}}}},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}}}}}}},"d":{"df":3,"docs":{"11":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0}},"e":{"/":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"g":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"5":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}},"n":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"q":{"df":1,"docs":{"8":{"tf":1.0}}}}},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"a":{"c":{"df":0,"docs":{},"t":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"o":{"df":2,"docs":{"2":{"tf":1.0},"9":{"tf":1.0}}},"p":{"a":{"d":{"df":0,"docs":{},"o":{"df":1,"docs":{"9":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}},"z":{"df":0,"docs":{},"x":{"df":1,"docs":{"3":{"tf":1.0}}}}},"j":{"a":{"df":0,"docs":{},"v":{"a":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"u":{"df":0,"docs":{},"p":{"df":0,"docs":{},"y":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"k":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"g":{"df":0,"docs":{},"l":{"df":1,"docs":{"5":{"tf":1.0}}}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"d":{"df":0,"docs":{},"g":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}}}},"o":{"df":0,"docs":{},"m":{"df":0,"docs":{},"i":{"df":0,"docs":{},"k":{"df":0,"docs":{},"o":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":0,"docs":{},"t":{"df":2,"docs":{"2":{"tf":1.4142135623730951},"3":{"tf":1.0}}}}}}}},"v":{"df":1,"docs":{"5":{"tf":1.0}}}},"l":{"a":{"b":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"11":{"tf":1.0},"6":{"tf":1.0}}},"df":0,"docs":{},"w":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"8":{"tf":1.0}}}}}}}},"df":0,"docs":{},"i":{"b":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"b":{"df":1,"docs":{"2":{"tf":1.4142135623730951}}},"df":0,"docs":{}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"k":{"df":9,"docs":{"0":{"tf":2.6457513110645907},"1":{"tf":2.6457513110645907},"10":{"tf":2.6457513110645907},"2":{"tf":2.6457513110645907},"3":{"tf":3.1622776601683795},"4":{"tf":2.0},"7":{"tf":2.449489742783178},"8":{"tf":1.0},"9":{"tf":2.23606797749979}}}},"v":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"o":{"d":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"5":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":1,"docs":{"9":{"tf":1.0}}}}},"l":{"a":{"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"6":{"tf":1.4142135623730951}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"df":4,"docs":{"10":{"tf":1.0},"2":{"tf":1.4142135623730951},"5":{"tf":1.4142135623730951},"9":{"tf":1.0}}}},"m":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":1,"docs":{"7":{"tf":1.0}}},"o":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"10":{"tf":1.0}}}}}}},"df":0,"docs":{}}},"u":{"c":{"df":0,"docs":{},"i":{"df":1,"docs":{"4":{"tf":1.0}}}},"df":0,"docs":{},"m":{"a":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}}}}}}}},"m":{"a":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":1,"docs":{"6":{"tf":1.0}}}}},"o":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"u":{"df":1,"docs":{"11":{"tf":1.4142135623730951}}}},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":2,"docs":{"5":{"tf":1.0},"6":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"m":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}}},"n":{"df":0,"docs":{},"g":{"df":1,"docs":{"2":{"tf":1.0}}}}},"f":{"a":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"p":{"df":0,"docs":{},"m":{"df":1,"docs":{"3":{"tf":1.0}}}}},"df":1,"docs":{"6":{"tf":1.7320508075688772}}}},"r":{"a":{"df":0,"docs":{},"g":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":0,"docs":{}}},"l":{"df":1,"docs":{"10":{"tf":1.0}},"l":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}},"m":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":1,"docs":{"11":{"tf":1.0}}}}},"o":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"i":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"n":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"y":{"df":0,"docs":{},"o":{"c":{"df":0,"docs":{},"r":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{}}}}}}},"p":{"4":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}}},"n":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"l":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"d":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"6":{"tf":1.0}}}}}}}},"t":{"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"s":{"df":0,"docs":{},"n":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}}}}}},"o":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}}},"df":1,"docs":{"5":{"tf":1.0}}}}},"p":{"df":0,"docs":{},"m":{"df":1,"docs":{"7":{"tf":1.0}}}},"u":{"df":1,"docs":{"9":{"tf":1.0}}},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"i":{"a":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}},"o":{"3":{"df":2,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.4142135623730951}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"c":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"i":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}}}}}},"df":1,"docs":{"3":{"tf":1.0}}}}},"n":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":0,"docs":{},"i":{"df":4,"docs":{"2":{"tf":1.0},"3":{"tf":1.0},"7":{"tf":1.4142135623730951},"9":{"tf":1.7320508075688772}},"以":{"3":{"0":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":0,"docs":{},"o":{"df":0,"docs":{},"k":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}}},"p":{"a":{"c":{"df":0,"docs":{},"k":{"a":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{".":{"df":0,"docs":{},"j":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"7":{"tf":1.0}}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"df":1,"docs":{"10":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"q":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"o":{"d":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}},"d":{"df":0,"docs":{},"f":{"df":2,"docs":{"11":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"x":{"df":2,"docs":{"11":{"tf":1.7320508075688772},"5":{"tf":1.7320508075688772}}}}}}}},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"p":{"df":1,"docs":{"10":{"tf":1.0}}}}}}}}}},"i":{"c":{"df":0,"docs":{},"k":{"df":0,"docs":{},"l":{"df":1,"docs":{"10":{"tf":1.0}}}}},"df":0,"docs":{},"m":{"df":0,"docs":{},"g":{"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"k":{"df":1,"docs":{"3":{"tf":1.0}}}}}}},"x":{"df":0,"docs":{},"v":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"s":{"df":1,"docs":{"5":{"tf":1.4142135623730951}}}}}}}},"l":{"a":{"df":0,"docs":{},"y":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"f":{"df":0,"docs":{},"f":{"df":0,"docs":{},"u":{"df":0,"docs":{},"s":{"df":1,"docs":{"8":{"tf":1.7320508075688772}}}}}}}},"df":1,"docs":{"8":{"tf":1.0}}}},"df":0,"docs":{},"u":{"df":1,"docs":{"4":{"tf":1.0}},"s":{"df":0,"docs":{},"订":{"df":0,"docs":{},"阅":{"df":0,"docs":{},"即":{"df":0,"docs":{},"可":{"df":0,"docs":{},"使":{"df":0,"docs":{},"用":{"df":0,"docs":{},"的":{"df":0,"docs":{},"免":{"df":0,"docs":{},"费":{"df":0,"docs":{},"g":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}}}}}}}}}}},"o":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}}},"r":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}}},"df":0,"docs":{}}}},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"i":{"df":0,"docs":{},"z":{"df":1,"docs":{"9":{"tf":1.0}}}}}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"p":{"df":0,"docs":{},"o":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"df":0,"docs":{},"t":{"df":0,"docs":{},"或":{"df":0,"docs":{},"p":{"d":{"df":0,"docs":{},"f":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}}}}}}}}}}}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"df":0,"docs":{},"e":{"df":0,"docs":{},"w":{"df":1,"docs":{"5":{"tf":1.0}}}}}}},"i":{"df":0,"docs":{},"m":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":1,"docs":{"7":{"tf":1.0}}}}}},"o":{"df":7,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"11":{"tf":1.0},"2":{"tf":1.7320508075688772},"4":{"tf":1.4142135623730951},"5":{"tf":1.0},"8":{"tf":1.0}},"m":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":2,"docs":{"11":{"tf":1.0},"3":{"tf":1.0}}}}}}},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"l":{"df":1,"docs":{"7":{"tf":1.0}}}}},"y":{"df":0,"docs":{},"t":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"q":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"k":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":0,"docs":{},"n":{"df":1,"docs":{"6":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"df":0,"docs":{}},"w":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"3":{"df":1,"docs":{"4":{"tf":1.0}}},"df":1,"docs":{"5":{"tf":1.0}}}}}},"r":{"1":{"df":1,"docs":{"5":{"tf":1.0}}},"a":{"df":0,"docs":{},"g":{"_":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"n":{"df":0,"docs":{},"i":{"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":1,"docs":{"2":{"tf":1.0}}}}}}}},"df":0,"docs":{}}}},"b":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":4,"docs":{"11":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.4142135623730951},"8":{"tf":1.0}}},"y":{"2":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{},"e":{"a":{"c":{"df":0,"docs":{},"t":{"df":2,"docs":{"11":{"tf":1.4142135623730951},"4":{"tf":1.7320508075688772}}}},"df":0,"docs":{}},"d":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":0,"docs":{},"v":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"b":{"df":0,"docs":{},"o":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"df":0,"docs":{}},"df":0,"docs":{},"q":{"df":0,"docs":{},"u":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"l":{"df":2,"docs":{"10":{"tf":1.0},"11":{"tf":1.0}}},"o":{"b":{"df":0,"docs":{},"o":{"b":{"df":0,"docs":{},"r":{"a":{"df":0,"docs":{},"i":{"df":0,"docs":{},"n":{"2":{".":{"0":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}},"df":0,"docs":{}}},"df":0,"docs":{},"m":{"a":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":1,"docs":{"9":{"tf":1.0}}}}},"df":0,"docs":{}},"o":{"df":0,"docs":{},"s":{"2":{".":{"0":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}},"df":0,"docs":{}},"u":{"df":0,"docs":{},"n":{"df":0,"docs":{},"w":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{}}}},"y":{"a":{"df":0,"docs":{},"n":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":0,"docs":{}}},"s":{"1":{"df":1,"docs":{"6":{"tf":1.7320508075688772}},"模":{"df":0,"docs":{},"型":{"df":0,"docs":{},"的":{"df":0,"docs":{},"精":{"df":0,"docs":{},"简":{"df":0,"docs":{},"版":{"df":0,"docs":{},"(":{"0":{".":{"5":{"b":{"df":0,"docs":{},"参":{"df":0,"docs":{},"数":{"df":0,"docs":{},")":{"df":0,"docs":{},"。":{"df":0,"docs":{},"s":{"1":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}},"a":{"df":0,"docs":{},"m":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"d":{"df":0,"docs":{},"k":{"df":1,"docs":{"10":{"tf":1.0}}}},"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"c":{"df":0,"docs":{},"h":{"df":1,"docs":{"7":{"tf":1.0}}}},"df":0,"docs":{}}},"c":{"df":1,"docs":{"5":{"tf":1.0}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"10":{"tf":1.0}}}}}},"df":0,"docs":{},"e":{"df":0,"docs":{},"l":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"2":{"tf":1.0}}}}}}},"h":{"a":{"df":0,"docs":{},"o":{"df":1,"docs":{"2":{"tf":1.0}}}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"9":{"tf":1.0}}}}},"l":{"df":0,"docs":{},"i":{"d":{"df":0,"docs":{},"e":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{}}},"o":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}},"t":{"a":{"df":1,"docs":{"4":{"tf":1.0}}},"df":0,"docs":{}}},"s":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}},"t":{"a":{"df":0,"docs":{},"r":{"df":3,"docs":{"5":{"tf":1.7320508075688772},"7":{"tf":2.0},"9":{"tf":1.7320508075688772}}}},"df":0,"docs":{},"u":{"d":{"df":0,"docs":{},"i":{"df":0,"docs":{},"o":{"df":3,"docs":{"10":{"tf":1.0},"2":{"tf":1.0},"4":{"tf":1.0}}}}},"df":0,"docs":{}}},"u":{"df":0,"docs":{},"n":{"df":4,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0}},"o":{"df":1,"docs":{"7":{"tf":1.0}}}},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"w":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"t":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}}}}}}}},"y":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"m":{"df":1,"docs":{"7":{"tf":1.0}}}}}}}},"t":{"df":1,"docs":{"9":{"tf":1.0}},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"7":{"tf":1.4142135623730951}}}},"df":0,"docs":{},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"3":{"tf":1.0}}}}}}}}}}},"o":{"d":{"a":{"df":0,"docs":{},"y":{"df":1,"docs":{"0":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{},"k":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"df":1,"docs":{"5":{"tf":1.0}}}}},"o":{"df":0,"docs":{},"l":{"df":1,"docs":{"3":{"tf":1.0}}}},"p":{"df":11,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"r":{"a":{"df":0,"docs":{},"e":{"df":1,"docs":{"5":{"tf":1.0}}},"n":{"df":0,"docs":{},"s":{"df":0,"docs":{},"f":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"m":{"df":3,"docs":{"10":{"tf":1.0},"11":{"tf":1.0},"5":{"tf":1.0}}}}}}}}},"df":0,"docs":{}},"t":{"df":2,"docs":{"5":{"tf":1.0},"8":{"tf":1.0}}},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":1,"docs":{"11":{"tf":1.0}}}}}}},"w":{"9":{"3":{"df":1,"docs":{"2":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"e":{"df":0,"docs":{},"t":{"df":1,"docs":{"8":{"tf":1.0}}}}}},"y":{"df":0,"docs":{},"p":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"c":{"df":0,"docs":{},"r":{"df":0,"docs":{},"i":{"df":0,"docs":{},"p":{"df":0,"docs":{},"t":{"df":1,"docs":{"4":{"tf":1.0}}}}}}},"df":0,"docs":{}}}}}},"u":{"df":0,"docs":{},"i":{"df":2,"docs":{"2":{"tf":1.0},"5":{"tf":1.0}}},"l":{"df":0,"docs":{},"t":{"df":0,"docs":{},"r":{"a":{"df":1,"docs":{"10":{"tf":1.0}}},"df":0,"docs":{}}}},"p":{"df":1,"docs":{"5":{"tf":1.0}}},"r":{"df":0,"docs":{},"l":{"df":1,"docs":{"8":{"tf":1.7320508075688772}}}}},"v":{"1":{"df":1,"docs":{"6":{"tf":1.0}}},"3":{"df":2,"docs":{"5":{"tf":1.0},"7":{"tf":1.0}}},"4":{".":{"5":{"df":1,"docs":{"5":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"6":{"tf":1.0}}}},"i":{"b":{"df":0,"docs":{},"e":{"df":3,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"3":{"tf":1.0}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"o":{"df":1,"docs":{"9":{"tf":1.0}},",":{"df":0,"docs":{},"基":{"df":0,"docs":{},"于":{"df":0,"docs":{},"其":{"d":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"m":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}}},"df":0,"docs":{}}}}}}}},"df":0,"docs":{},"p":{"df":1,"docs":{"8":{"tf":1.4142135623730951}}}},"l":{"df":1,"docs":{"6":{"tf":1.0}},"m":{"df":1,"docs":{"10":{"tf":1.0}}}},"o":{"df":0,"docs":{},"s":{"df":0,"docs":{},"k":{"df":1,"docs":{"2":{"tf":1.0}}}},"y":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"6":{"tf":1.0}}}},"df":0,"docs":{}}},"q":{"a":{"df":1,"docs":{"11":{"tf":1.0}}},"df":0,"docs":{}},"r":{"a":{"df":0,"docs":{},"g":{"df":1,"docs":{"11":{"tf":1.0}}}},"df":0,"docs":{},"i":{"df":1,"docs":{"10":{"tf":1.0}}}},"u":{"df":0,"docs":{},"e":{"df":1,"docs":{"4":{"tf":1.0}}}}},"w":{"df":0,"docs":{},"e":{"b":{"c":{"df":0,"docs":{},"h":{"df":0,"docs":{},"o":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"a":{"df":0,"docs":{},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"n":{"a":{"df":1,"docs":{"9":{"tf":1.0}}},"df":0,"docs":{}}}}},"df":0,"docs":{}}}}}},"d":{"df":0,"docs":{},"e":{"df":0,"docs":{},"v":{"df":1,"docs":{"5":{"tf":1.0}}}}},"df":0,"docs":{}},"df":0,"docs":{}},"i":{"df":0,"docs":{},"n":{"d":{"df":0,"docs":{},"o":{"df":0,"docs":{},"w":{"df":1,"docs":{"2":{"tf":1.0}}}},"s":{"df":0,"docs":{},"u":{"df":0,"docs":{},"r":{"df":0,"docs":{},"f":{"df":1,"docs":{"8":{"tf":1.0}}}}}}},"df":0,"docs":{}},"r":{"df":0,"docs":{},"e":{"df":0,"docs":{},"g":{"df":0,"docs":{},"u":{"a":{"df":0,"docs":{},"r":{"d":{"df":1,"docs":{"6":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}}}}},"w":{"d":{"c":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{},"w":{"df":0,"docs":{},"g":{"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"b":{"df":0,"docs":{},"u":{"df":0,"docs":{},"l":{"df":0,"docs":{},"i":{"df":1,"docs":{"2":{"tf":1.0}}}}}},"df":0,"docs":{}}}},"y":{"df":0,"docs":{},"e":{"df":0,"docs":{},"s":{"df":0,"docs":{},"t":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"d":{"a":{"df":0,"docs":{},"y":{"df":2,"docs":{"6":{"tf":1.0},"7":{"tf":1.0}}}},"df":0,"docs":{}},"df":0,"docs":{}}}}}}}}}},"x":{"a":{"df":0,"docs":{},"i":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}}},"df":2,"docs":{"0":{"tf":1.4142135623730951},"1":{"tf":1.4142135623730951}}},"y":{"a":{"df":0,"docs":{},"n":{"df":0,"docs":{},"g":{"df":0,"docs":{},"y":{"df":0,"docs":{},"i":{"df":2,"docs":{"3":{"tf":1.0},"5":{"tf":1.0}}}}}}},"df":0,"docs":{},"o":{"df":0,"docs":{},"u":{"df":0,"docs":{},"t":{"df":0,"docs":{},"u":{"b":{"df":1,"docs":{"7":{"tf":1.0}}},"df":0,"docs":{}}}}}},"z":{"df":0,"docs":{},"e":{"df":0,"docs":{},"r":{"df":0,"docs":{},"o":{"df":1,"docs":{"10":{"tf":1.4142135623730951}},"g":{"df":0,"docs":{},"u":{"df":0,"docs":{},"i":{"df":1,"docs":{"11":{"tf":1.0}}}}}}}}}}},"title":{"root":{"2":{"0":{"2":{"5":{"/":{"6":{"/":{"1":{"0":{"df":1,"docs":{"2":{"tf":1.0}}},"1":{"df":2,"docs":{"0":{"tf":1.0},"1":{"tf":1.0}}},"df":0,"docs":{}},"5":{"df":1,"docs":{"7":{"tf":1.0}}},"6":{"df":1,"docs":{"6":{"tf":1.0}}},"7":{"df":1,"docs":{"5":{"tf":1.0}}},"8":{"df":1,"docs":{"4":{"tf":1.0}}},"9":{"df":1,"docs":{"3":{"tf":1.0}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{},"年":{"6":{"df":0,"docs":{},"月":{"1":{"df":1,"docs":{"11":{"tf":1.0}}},"2":{"df":1,"docs":{"10":{"tf":1.0}}},"3":{"df":1,"docs":{"9":{"tf":1.0}}},"4":{"df":1,"docs":{"8":{"tf":1.0}}},"df":0,"docs":{}}},"df":0,"docs":{}}},"df":0,"docs":{}},"df":0,"docs":{}},"df":0,"docs":{}},"a":{"df":0,"docs":{},"i":{"df":12,"docs":{"0":{"tf":1.0},"1":{"tf":1.0},"10":{"tf":1.0},"11":{"tf":1.0},"2":{"tf":1.0},"3":{"tf":1.0},"4":{"tf":1.0},"5":{"tf":1.0},"6":{"tf":1.0},"7":{"tf":1.0},"8":{"tf":1.0},"9":{"tf":1.0}}}},"df":0,"docs":{}}}},"lang":"English","pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5"},"results_options":{"limit_results":30,"teaser_word_count":30},"search_options":{"bool":"OR","expand":true,"fields":{"body":{"boost":1},"breadcrumbs":{"boost":1},"title":{"boost":2}}}}'); \ No newline at end of file diff --git a/today/book/toc.html b/today/book/toc.html new file mode 100644 index 0000000..e1e883b --- /dev/null +++ b/today/book/toc.html @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + +
  1. Today
  2. 2025-06
  3. 06-11-日刊
  4. 06-10-日刊
  5. 06-09-日刊
  6. 06-08-日刊
  7. 06-07-日刊
  8. 06-06-日刊
  9. 06-05-日刊
  10. 06-04-日刊
  11. 06-03-日刊
  12. 06-02-日刊
  13. 06-01-日刊
+ + diff --git a/today/book/toc.js b/today/book/toc.js new file mode 100644 index 0000000..572dbc6 --- /dev/null +++ b/today/book/toc.js @@ -0,0 +1,70 @@ +// Populate the sidebar +// +// This is a script, and not included directly in the page, to control the total size of the book. +// The TOC contains an entry for each page, so if each page includes a copy of the TOC, +// the total size of the page becomes O(n**2). +class MDBookSidebarScrollbox extends HTMLElement { + constructor() { + super(); + } + connectedCallback() { + this.innerHTML = '
  1. Today
  2. 2025-06
  3. 06-11-日刊
  4. 06-10-日刊
  5. 06-09-日刊
  6. 06-08-日刊
  7. 06-07-日刊
  8. 06-06-日刊
  9. 06-05-日刊
  10. 06-04-日刊
  11. 06-03-日刊
  12. 06-02-日刊
  13. 06-01-日刊
'; + // Set the current, active page, and reveal it if it's hidden + let current_page = document.location.href.toString().split("#")[0].split("?")[0]; + if (current_page.endsWith("/")) { + current_page += "index.html"; + } + var links = Array.prototype.slice.call(this.querySelectorAll("a")); + var l = links.length; + for (var i = 0; i < l; ++i) { + var link = links[i]; + var href = link.getAttribute("href"); + if (href && !href.startsWith("#") && !/^(?:[a-z+]+:)?\/\//.test(href)) { + link.href = path_to_root + href; + } + // The "index" page is supposed to alias the first chapter in the book. + if (link.href === current_page || (i === 0 && path_to_root === "" && current_page.endsWith("/index.html"))) { + link.classList.add("active"); + var parent = link.parentElement; + if (parent && parent.classList.contains("chapter-item")) { + parent.classList.add("expanded"); + } + while (parent) { + if (parent.tagName === "LI" && parent.previousElementSibling) { + if (parent.previousElementSibling.classList.contains("chapter-item")) { + parent.previousElementSibling.classList.add("expanded"); + } + } + parent = parent.parentElement; + } + } + } + // Track and set sidebar scroll position + this.addEventListener('click', function(e) { + if (e.target.tagName === 'A') { + sessionStorage.setItem('sidebar-scroll', this.scrollTop); + } + }, { passive: true }); + var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll'); + sessionStorage.removeItem('sidebar-scroll'); + if (sidebarScrollTop) { + // preserve sidebar scroll position when navigating via links within sidebar + this.scrollTop = sidebarScrollTop; + } else { + // scroll sidebar to current active section when navigating via "next/previous chapter" buttons + var activeSection = document.querySelector('#sidebar .active'); + if (activeSection) { + activeSection.scrollIntoView({ block: 'center' }); + } + } + // Toggle buttons + var sidebarAnchorToggles = document.querySelectorAll('#sidebar a.toggle'); + function toggleSection(ev) { + ev.currentTarget.parentElement.classList.toggle('expanded'); + } + Array.from(sidebarAnchorToggles).forEach(function (el) { + el.addEventListener('click', toggleSection); + }); + } +} +window.customElements.define("mdbook-sidebar-scrollbox", MDBookSidebarScrollbox); diff --git a/today/book/tomorrow-night.css b/today/book/tomorrow-night.css new file mode 100644 index 0000000..11752b8 --- /dev/null +++ b/today/book/tomorrow-night.css @@ -0,0 +1,104 @@ +/* Tomorrow Night Theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ +/* Original theme - https://github.com/chriskempson/tomorrow-theme */ +/* https://github.com/jmblog/color-themes-for-highlightjs */ + +/* Tomorrow Comment */ +.hljs-comment { + color: #969896; +} + +/* Tomorrow Red */ +.hljs-variable, +.hljs-attribute, +.hljs-attr, +.hljs-tag, +.hljs-regexp, +.ruby .hljs-constant, +.xml .hljs-tag .hljs-title, +.xml .hljs-pi, +.xml .hljs-doctype, +.html .hljs-doctype, +.css .hljs-id, +.css .hljs-class, +.css .hljs-pseudo { + color: #cc6666; +} + +/* Tomorrow Orange */ +.hljs-number, +.hljs-preprocessor, +.hljs-pragma, +.hljs-built_in, +.hljs-literal, +.hljs-params, +.hljs-constant { + color: #de935f; +} + +/* Tomorrow Yellow */ +.ruby .hljs-class .hljs-title, +.css .hljs-rule .hljs-attribute { + color: #f0c674; +} + +/* Tomorrow Green */ +.hljs-string, +.hljs-value, +.hljs-inheritance, +.hljs-header, +.hljs-name, +.ruby .hljs-symbol, +.xml .hljs-cdata { + color: #b5bd68; +} + +/* Tomorrow Aqua */ +.hljs-title, +.hljs-section, +.css .hljs-hexcolor { + color: #8abeb7; +} + +/* Tomorrow Blue */ +.hljs-function, +.python .hljs-decorator, +.python .hljs-title, +.ruby .hljs-function .hljs-title, +.ruby .hljs-title .hljs-keyword, +.perl .hljs-sub, +.javascript .hljs-title, +.coffeescript .hljs-title { + color: #81a2be; +} + +/* Tomorrow Purple */ +.hljs-keyword, +.javascript .hljs-function { + color: #b294bb; +} + +.hljs { + display: block; + overflow-x: auto; + background: #1d1f21; + color: #c5c8c6; +} + +.coffeescript .javascript, +.javascript .xml, +.tex .hljs-formula, +.xml .javascript, +.xml .vbscript, +.xml .css, +.xml .hljs-cdata { + opacity: 0.5; +} + +.hljs-addition { + color: #718c00; +} + +.hljs-deletion { + color: #c82829; +} diff --git a/today/book/wrangler.toml b/today/book/wrangler.toml new file mode 100644 index 0000000..a57e62d --- /dev/null +++ b/today/book/wrangler.toml @@ -0,0 +1,41 @@ +# wrangler.toml +name = "ai-daily" +main = "src/index.js" # <-- Important: path to your main worker script +compatibility_date = "2025-05-20" # Or your project's compatibility date +workers_dev = true + +kv_namespaces = [ + { binding = "DATA_KV", id = "kv数据库的ID" } +] + +[vars] +OPEN_TRANSLATE = "true" +USE_MODEL_PLATFORM = "GEMINI" #GEMINI, OPEN +GEMINI_API_KEY = "xxxxxx-xxxxxx" +GEMINI_API_URL = "https://gemini-proxy.keyikai.me" #网上公共的代理api +DEFAULT_GEMINI_MODEL = "gemini-2.5-flash-preview-05-20" +OPENAI_API_KEY = "sk-xxxxxx" # Replace with your actual OpenAI API Key +OPENAI_API_URL = "https://api.deepseek.com" # Or your OpenAI compatible API URL +DEFAULT_OPEN_MODEL = "deepseek-chat" +FOLO_COOKIE_KV_KEY = "folo_auth_cookie" +FOLO_DATA_API = "https://api.follow.is/entries" +FOLO_FILTER_DAYS = 3 +AIBASE_FEED_ID = "69533603812632576" +AIBASE_FETCH_PAGES = "3" +XIAOHU_FEED_ID = "151846580097413120" +XIAOHU_FETCH_PAGES = "2" +HGPAPERS_FEED_ID = "41359648680482832" +HGPAPERS_FETCH_PAGES = "2" +TWITTER_LIST_ID = "153028784690326528" +TWITTER_FETCH_PAGES = "5" +PROJECTS_API_URL = "https://git-trending.justlikemaki.vip/topone/?since=daily" +GITHUB_TOKEN = "github_pat_xxxxxx" +GITHUB_REPO_OWNER = "justlovemaki" +GITHUB_REPO_NAME = "CloudFlare-AI-Insight-Daily" +GITHUB_BRANCH = "main" +LOGIN_USERNAME = "root" +LOGIN_PASSWORD = "toor" +DAILY_TITLE = "AI洞察日报" +PODCAST_TITLE = "来生小酒馆" +PODCAST_BEGIN = "嘿,亲爱的V,欢迎收听新一期的来生情报站,我是你们的老朋友,何夕2077" +PODCAST_END = "今天的情报就到这里,注意隐蔽,赶紧撤离" \ No newline at end of file