init book
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 "$@"
|
||||
Binary file not shown.
@@ -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 <path_to_working_directory>"
|
||||
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! ---"
|
||||
@@ -1,6 +0,0 @@
|
||||
[book]
|
||||
authors = []
|
||||
language = "zh"
|
||||
src = "CloudFlare-AI-Insight-Daily"
|
||||
title = "By 何夕2077"
|
||||
create-missing = true
|
||||
@@ -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
|
||||
@@ -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 <action> [options]"
|
||||
echo ""
|
||||
echo "Actions:"
|
||||
echo " delete <file_path_in_repo> <commit_message>"
|
||||
echo " 删除仓库中的指定文件。"
|
||||
echo " Example: $0 delete 'path/to/remote/file.txt' 'Delete old file'"
|
||||
echo ""
|
||||
echo " upload <local_file_path> <file_path_in_repo> <commit_message>"
|
||||
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 操作需要 <file_path_in_repo> 和 <commit_message> 参数。"
|
||||
usage
|
||||
fi
|
||||
delete_github_file "$2" "$3"
|
||||
;;
|
||||
upload)
|
||||
if [ "$#" -ne 4 ]; then
|
||||
echo "错误: upload 操作需要 <local_file_path>, <file_path_in_repo> 和 <commit_message> 参数。"
|
||||
usage
|
||||
fi
|
||||
upload_github_file "$2" "$3" "$4"
|
||||
;;
|
||||
*)
|
||||
echo "错误: 未知操作或缺少操作参数。"
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
||||
@@ -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 "替换完成。"
|
||||
16
daily/2025-06-01.md
Normal file
16
daily/2025-06-01.md
Normal file
@@ -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)。
|
||||
30
daily/2025-06-02.md
Normal file
30
daily/2025-06-02.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# AI洞察日报 2025年6月2日
|
||||
|
||||
**AI产品与功能更新**
|
||||
|
||||
1. Runway公司最新推出的**Gen-4References**功能已支持移动设备,使用户能通过手机照片结合自然语言提示,快速生成风格一致的艺术作品。这项功能将**AI生成技术**与移动便捷性完美结合,大幅降低了**AI创作**门槛,为内容创作者和普通用户带来了无限可能。
|
||||
<br/> [](https://upload.chinaz.com/2025/0530/6388420978332595536873671.png) <br/>
|
||||
2. Anthropic近期宣布,其旗舰模型**Claude**已新增功能,支持开发者构建能与Claude直接对话的**AI应用程序**,这与**AI Studio**的开发理念高度契合。此举不仅降低了**AI应用开发**门槛,为开发者提供了更广阔的创新空间,也预示着AI应用普及与落地将进一步加速。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202403050858462025_0.jpg) <br/>
|
||||
|
||||
**AI前沿研究**
|
||||
|
||||
1. 华为近期通过其"昇腾 + Pangu Ultra MoE”系统展示了一项惊人突破:一个近万亿参数的MoE大模型,在不使用GPU的情况下,仅需2秒便能解答一道高等数学题。这不仅彰显了华为在自主可控国产算力与模型训练方面的强大实力,也为未来大规模AI模型的训练与应用开辟了新可能。
|
||||
<br/> [](https://upload.chinaz.com/2025/0530/6388421664760221719225455.png) <br/>
|
||||
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的电力需求仍在快速增长,凸显了在能耗与可持续发展之间寻找平衡的重要性。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202005281122057197_51.jpg) <br/>
|
||||
2. 近期,黑客通过伪装成**阿里云AI SDK**的恶意软件包,成功实施了供应链攻击,利用隐藏在**Pickle**格式ML模型中的**恶意代码**窃取用户敏感信息。这揭示了**AI安全供应链**面临的新挑战,传统安全工具在检测恶意ML模型方面的不足,以及开发者面临的潜在风险。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202306161513254632_1.jpg) <br/>
|
||||
|
||||
**开源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)。
|
||||
19
daily/2025-06-03.md
Normal file
19
daily/2025-06-03.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# AI洞察日报 2025年6月3日
|
||||
|
||||
**AI产品与功能更新**
|
||||
1. 谷歌近日在美国地区推出了 **Gemini Live** 功能,正式登陆 **iOS** 和 **iPadOS** 平台,用户可通过 **Gemini App** 免费体验 **AI** 识别场景和屏幕内容的便捷。这项创新不仅提升了用户互动体验,也预示着 **AI** 技术正进一步融入日常生活,成为人们的智能助手。 <br/> [](https://upload.chinaz.com/2025/0603/6388453725280965957304782.png) <br/>
|
||||
2. 微软最新推出了免费的 **Bing Video Creator** 工具,基于 **OpenAI Sora** 技术,让用户通过简单的文字提示即可轻松创作短视频。这款工具已在全球范围内的必应移动应用中上线,极大降低了视频创作的门槛,有望丰富用户的创作体验。 <br/> [](https://upload.chinaz.com/2025/0603/6388453719041406883771175.png) <br/>
|
||||
3. 新加坡国立大学(NUS)团队近日发布了 **OmniConsistency** 项目,它以极低成本复现了 **GPT-4o** 在图像风格化上的一致性,解决了开源社区的风格化难题。该项目通过独特的学习框架和模块化架构,有望成为图像生成领域的重要工具,推动 **AI** 艺术创作。 <br/> [](https://upload.chinaz.com/2025/0603/6388453880310640421505355.png) <br/>
|
||||
|
||||
**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** 在法律领域应用的广泛争议。此事件深刻提醒法律从业者,在使用新兴技术时,务必保持严谨的**审核责任**,确保法律文件的准确性。 <br/> [](https://pic.chinaz.com/picmap/202304121052180076_0.jpg) <br/>
|
||||
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** 功能,旨在简化社交媒体管理。
|
||||
36
daily/2025-06-04.md
Normal file
36
daily/2025-06-04.md
Normal file
@@ -0,0 +1,36 @@
|
||||
# AI洞察日报 2025年6月4日
|
||||
|
||||
**AI产品与功能更新**
|
||||
|
||||
1. Komiko平台近日推出**视频到视频**功能,利用AI技术将用户上传的视频一键转换为**动漫**、漫画等多样化艺术风格的动态内容,极大降低了动画创作的门槛。该功能通过深度整合先进AI模型,并提供AI线稿上色、动画补帧等工具,旨在加速创意产业的数字化转型,成为专业人士和爱好者的**首选**创作工具。
|
||||
<br/> [](https://upload.chinaz.com/2025/0604/6388464889049235843422625.png) <br/>
|
||||
2. 蚂蚁集团的**"AI健康管家”**成功通过信通院医疗健康行业大模型**可信评估**,成为首批获认可的产品之一,进一步提升了其在医疗AI领域的**可靠性**。该产品已服务超**4000万用户**,提供预约医生、健康评估、报告解读等**智能健康服务**,并吸引了60多位知名医生AI智能体入驻,未来将持续扩展功能。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202309121506505395_0.jpg) <br/>
|
||||
|
||||
**AI前沿研究**
|
||||
|
||||
1. AI"教父”**约书亚・本吉奥**成立非营利组织**LawZero**,投入3000万美元启动资金,旨在开发**"科学家 AI”**系统以防范未来AI智能体对人类进行欺骗。该系统将作为AI安全监控的**护栏**,确保自身智能程度与所监管AI智能体相当,通过提高AI的**透明性和可信性**,推动行业向更负责任的方向发展。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202412271635326771_0.jpg) <br/>
|
||||
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在激烈市场竞争中的**未来增长**。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202502061719371797_2.jpg) <br/>
|
||||
|
||||
**开源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在处理异构、多模态知识时的挑战,并通过医疗和金融案例展示了其**应用价值**。
|
||||
<br/> [](https://pbs.twimg.com/media/Gsj5vqPa0AAPVEa?format=jpg&name=orig) <br/> <br/> [](https://pbs.twimg.com/media/Gsj52bAasAIfgTI?format=jpg&name=orig) <br/> <br/> [](https://pbs.twimg.com/media/Gsj54ksasAADTeL?format=jpg&name=orig) <br/> 文章链接:[文章](https://bestblogs.dev/article/2ba211)
|
||||
23
daily/2025-06-05.md
Normal file
23
daily/2025-06-05.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# AI洞察日报 2025/6/5
|
||||
|
||||
**AI产品与功能更新**
|
||||
1. Suno 近日升级了其**AI音乐编辑工具**,允许用户上传和混音未完成的作品,并能修改歌词和延长曲目时长至八分钟,同时引入了创意滑块等功能。 <br/> [](https://pic.chinaz.com/picmap/202406061628284261_1.jpg) <br/> 此次升级正值其面临主要唱片公司的版权诉讼,唱片公司希望引入类似于 **YouTube Content ID** 的技术来追踪 **AI** 平台上的音乐使用情况。
|
||||
2. OpenAI 近日宣布 **ChatGPT** 升级新功能,现可连接 **Outlook**、**Teams**、**Gmail** 等多个外部服务,旨在提升企业用户的协作和信息获取效率。 <br/> [](https://pic.chinaz.com/picmap/202412271704353969_1.jpg) <br/> 此外,**macOS** 版 **ChatGPT Team** 用户还新增了"**录制模式**”,能自动生成会议记录和待办事项。
|
||||
3. AI驱动的代码编辑器 **Cursor** 于近日正式发布1.0版本,引入了核心功能 **BugBot**,能自动化审查 **GitHub** 上的 **Pull Request** 并一键修复代码。 <br/> [](https://upload.chinaz.com/2025/0605/6388471022950404092684122.png) <br/> 该版本还全面开放了后台代理功能,并增加了 **Jupyter** 支持和"Memories”项目管理功能,旨在显著提升开发者的生产力。
|
||||
4. 腾讯公益近日推出了创新性的"**问 AI**”功能,首次将**大型人工智能模型**应用于公益领域,旨在提升公众与公益项目及机构之间的互动和透明度。 <br/> [](https://pic.chinaz.com/picmap/201811151633427149_4.jpg) <br/> 这一便捷的沟通方式有助于公众更深入地理解并参与公益事业,并有望推动公益事业的进一步发展。
|
||||
|
||||
**AI前沿研究**
|
||||
1. 这项研究提出 **SuperWriter-Agent** 框架,通过引入结构化的思考、规划和完善阶段,显著提升了**大型语言模型**在生成长文本时的连贯性和质量。 <br/> 基于此框架训练的 **SuperWriter-LM** 在多项基准测试中表现出领先水平,证明了这种反思驱动方法能够让模型像专业作家一样,生成更高质量和一致性的长篇内容:[Link](https://arxiv.org/abs/2506.04180)。
|
||||
|
||||
**AI行业展望与社会影响**
|
||||
1. OpenAI 首席执行官 **山姆・奥尔特曼** 指出,**AI** 正逐渐被企业视为基层员工,导致科技公司初级职位招聘量在2023至2024年间下降了25%。 <br/> [](https://pic.chinaz.com/picmap/202305291455510902_2.jpg) <br/> 专家预测,到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友好** 的多种格式输出数据。 <br/> [](https://upload.chinaz.com/2025/0605/6388471694605610854897111.png) <br/> 这一功能极大简化了 **AI** 应用的数据获取流程,无需第三方依赖,提升了数据处理效率,并在 **GitHub** 上已获得超过10K的 **Star**。
|
||||
|
||||
**社媒分享**
|
||||
1. **Gorden Sun** 分享了一套能生成"超级赞”图文效果的 **AI** 提示词,并推荐使用 **GPT4o**、**Claude-3.7** 和 **DeepSeek-V3** 等工具。 <br/> [](https://pbs.twimg.com/media/Gse1INSb0AQCh0S?format=jpg&name=orig) <br/> 他指出,这些提示词虽然易于使用,但原作者在整理上花费了心思:[Link](https://x.com/Gorden_Sun/status/1930466986544308552)。
|
||||
2. 推主 **wwwyesterday** 将现代学术论文比作 **npm** 包管理系统,认为两者都存在论文/包数量庞大、引用/依赖层层叠叠的现象,且大部分价值不高,少数经典广为引用。 <br/> 他指出,现在很少有人能完全从零开始原创,就像写东西离不开 `package.json`,但他仍会刷 **arxiv** 寻找新观点:[Link](https://x.com/wwwgoubuli/status/1930310020312510934)。
|
||||
29
daily/2025-06-06.md
Normal file
29
daily/2025-06-06.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# AI洞察日报 2025/6/6
|
||||
|
||||
**AI产品与功能更新**
|
||||
1. **Pollo AI** 推出了一站式**AI图像与视频生成平台**,整合全球前沿模型如Google Veo 3、Kling等,提供文字转视频、图像风格化、角色一致性等多种功能,并支持API接入,相比同类平台更具成本和模型优势,且获得Google Cloud的Veo 3模型授权。
|
||||
<br/> [](https://assets-v2.circle.so/5fit6knlg31jzz4ds9stmn0z1wda) <br/>
|
||||
2. **Luma Labs** 发布了全新的**AI视频编辑工具** Modify Video,基于其Dream Machine平台和**Ray2模型**,用户能通过文本提示对视频进行风格重塑、场景替换和角色调整,大幅降低了传统视频制作的复杂性和成本。该工具凭借Ray2模型的强大能力,在动作流畅性和时间一致性方面表现出色,并降低了创意门槛。
|
||||
<br/> [](https://upload.chinaz.com/2025/0605/6388474336287139806268530.png) <br/>
|
||||
3. 谷歌更新了**Gemini 2.5版本**,显著提升了**AI音频对话与生成技术**,使其成为一个能够原生理解和生成文本、图像、音频、视频和代码的多模态AI系统。新功能使得人机交流更加自然流畅,支持实时音频对话、风格控制和多语言,并通过可控的文本转语音技术,允许用户精确调整语音输出的语调和情感。
|
||||
<br/> [](https://upload.chinaz.com/2025/0605/6388474192800462061689108.png) <br/>
|
||||
4. 热门手游《**逆水寒**》与**可灵AI**合作,在游戏内推出了全新的"**图生动图**”玩法,让玩家能够通过简单操作将静态图片转化为个性化动态画面。该功能支持用户截图或上传图片,通过输入描述词来生成动图,并可进行双人互动创作,提升了玩家的游戏体验。
|
||||
<br/> [](https://upload.chinaz.com/2025/0605/6388473368297009187838113.png) <br/>
|
||||
|
||||
**AI前沿研究**
|
||||
1. **NVIDIA** 发布了**Llama-3.1-Nemotron-Nano-VL-8B-V1**,这是一款基于Llama-3.1架构的**8B参数视觉语言模型**,支持图像、视频和文本输入,并能输出高质量文本及具备强大的图像推理能力。该模型在OCR和文档智能方面表现卓越,通过AWQ4bit量化技术可在单张RTX GPU上高效部署,并已在Hugging Face平台开源,为开发者提供了轻量高效的多模态AI解决方案。
|
||||
<br/> [](https://upload.chinaz.com/2025/0605/6388473110722451938945298.jpg) <br/>
|
||||
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行业进入多极对抗新时代。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202304171408567483_0.jpg) <br/>
|
||||
|
||||
**开源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)。
|
||||
29
daily/2025-06-07.md
Normal file
29
daily/2025-06-07.md
Normal file
@@ -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 设计**能力。 <br/> [](https://upload.chinaz.com/2025/0606/6388481749990229697161576.png) <br/> 此次升级优化了代码转换、编辑及复杂代理工作流,并已免费向用户开放,有望推动**AI**在**区块链**和**去中心化应用**领域的创新。
|
||||
4. 海外知名的**AI 视频生成平台 PixVerse**正式推出其国内版"**拍我AI**”,同步上线移动端 App 和网页版,旨在为国内内容创作者和企业提供高效便捷的**AI 视频生成工具**。 <br/> [](https://upload.chinaz.com/2025/0606/6388481574736715558459901.png) <br/> "**拍我AI**”支持通过文本或图像一键生成高质量、多风格视频,依托 PixVerse V4.5 算法并进行了本地化优化,有望推动中国市场**AI 视频技术**的普及和应用。
|
||||
5. **ElevenLabs**于2025年6月5日发布了被誉为"地表最强”的**文本转语音(TTS)模型**,**Eleven v3 (Alpha 版)**,该模型不仅能将文本转化为自然流畅的语音,还能通过**音频标签**精确控制情感、语速甚至加入音效,实现"演技合成”。 <br/> [](https://upload.chinaz.com/2025/0606/6388479747817228256386757.png) <br/> [](https://upload.chinaz.com/2025/0606/6388479739813195471789762.png) <br/> 它支持**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 王兴兴**在第七届**北京智源大会**上表示,公司始终坚持的终极目标是让**机器人**实现家庭和工业场景的**实用化工作**,而跳舞和格斗等具身智能展示仅是训练和技术验证的手段。 <br/> [](https://pic.chinaz.com/picmap/202304171730201359_10.jpg) <br/> 他透露,今年上半年**人形机器人**在商业租赁市场已初具规模并带来可观价值,未来将加速机器人实用化落地。
|
||||
2. 知名科技博主**王自如**在**B站**宣布复更,并正式更名为"**王自如AI**”,表示将以**AI 测评 UP 主**的身份开启二次创业,专注于**AI 内容创业**和**AI 应用**,助力传统产业数字化转型。 <br/> [](https://upload.chinaz.com/2025/0606/6388480568808508227034081.png) <br/> 他在视频中感谢了**董明珠**和**雷军**的鼓励和帮助,并提及此前入职格力是为重塑销售体系。
|
||||
|
||||
**开源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的**智能参考**功能,该功能支持用户基于上传图像生成任何内容,并能修改照片背景、添加配饰、更改姿势,甚至精确添加或修改复杂**文字效果**。 <br/> [](https://cdnv2.ruguoapp.com/FvtrC2kjbbXAClT4WeaTRXbuwUnlv3.jpeg) <br/> 这一突破性能力极大地提升了日常照片分享的表现力,并能高效生成电商产品图、小红书和视频封面等**营销物料**。文章链接:[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)。
|
||||
17
daily/2025-06-08.md
Normal file
17
daily/2025-06-08.md
Normal file
@@ -0,0 +1,17 @@
|
||||
# AI洞察日报 2025/6/8
|
||||
|
||||
**AI产品与功能更新**
|
||||
1. 阿里巴巴于6月6日正式开源了全新的**千问3向量模型**系列**Qwen3-Embedding**,其在文本检索、聚类和分类等任务上的性能提升超40%,并超越谷歌和OpenAI的顶尖模型,获得了同类模型的**最佳性能**(SOTA),同时具备强大的多语言支持能力。 <br/> [](https://pic.chinaz.com/picmap/202504151007236218_3.jpg) <br/> 该系列共9款模型,已在魔搭社区、Hugging Face和GitHub等平台开源,并可通过阿里云百炼使用API服务,为全球开发者提供了更高效的AI应用空间。
|
||||
2. **AI**驱动的本地视频编辑工具**Diffusion Studio Pro**正式亮相,该产品被誉为"CapCut + Cursor”结合,以本地优先、浏览器为基础的非线性编辑体验,集成了超过16种生成式**AI模型**,旨在降低创作门槛并大幅提升专业视频创作者的工作效率。其提供免费无限层级,有望成为AI驱动视频编辑的行业标杆,为创作者带来更高效、直观的创作体验。
|
||||
3. 谷歌于6月5日发布了名为**Portraits**的创新**AI产品**,用户可通过与虚拟专家进行实时对话,获得个性化的沟通技巧与领导力学习体验,首批虚拟专家基于知名畅销书作者打造。 <br/> [](https://upload.chinaz.com/2025/0606/6388480752743547666381573.png) <br/> 该产品依托谷歌先进的**生成式AI技术**,强调交互性和实践性,目前仅对美国IP用户开放测试,预示着**AI教育**将迈向更互动、更个性化的新阶段。
|
||||
|
||||
**AI前沿研究**
|
||||
1. 在第七届"北京智源大会”上,智源研究院重磅推出了一系列名为"悟界”的**大模型**,其中包括原生多模态世界模型**Emu3**、脑科学多模态通用基础模型见微**Brainμ**,以及具身智能的协作框架**RoboOS2.0**和**RoboBrain2.0**等。 <br/> [](https://pic.chinaz.com/picmap/202307211343352678_2.jpg) <br/> 这些模型旨在推动人工智能在医疗、教育、环境监测等多个重要领域的应用落地,展现了智源研究院在**多模态智能技术**方面的雄心和实力。
|
||||
|
||||
**开源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,从而大幅提升前端网页的视觉美观度和风格统一性。 <br/> [](https://cdnv2.ruguoapp.com/Fmks9yCJBJ1rO-T5g9BPepCxci-v3.png) <br/> <br/> [](https://cdnv2.ruguoapp.com/FqkHGytOOk8dLy3WejWlcbSLAIBqv3.png) <br/> 更多详情请访问:[Link](https://m.okjike.com/originalPosts/68444463dfa0f1ef3adbbf9b)。
|
||||
2. wwwgoubuli预估接下来社交媒体上将出现两种热门内容:一部分是深入分析**作文题目**的讨论,另一部分则是围绕**AI写作文**展开的创作比拼,展现了对当前AI应用趋势的敏锐观察。更多信息:[Link](https://x.com/wwwgoubuli/status/1931206161044484395)。
|
||||
24
daily/2025-06-09.md
Normal file
24
daily/2025-06-09.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# AI洞察日报 2025/6/9
|
||||
|
||||
**AI产品与功能更新**
|
||||
1. **OpenAI** 宣布 **ChatGPT** 高级语音功能升级,显著提升了语音交互的自然性和流畅度,使其**语调更自然、节奏更真实、情绪表达更丰富**,并加入了**双向自动翻译**功能,能持续进行多轮对话翻译,无需重复指令,特别适用于国际出行、远程办公和语言学习等场景。
|
||||
2. 面壁智能于6月6日发布了 **MiniCPM 4.0系列** 模型,包括8B稀疏版和0.5B轻巧版,在端侧性能上实现了**极限情况下220倍、常规5倍的速度提升**,通过**系统级稀疏创新**和高效双频换挡技术,大幅减少了端侧存储需求,并已成功适配Intel、高通等主流芯片。
|
||||
<br/> [](https://upload.chinaz.com/2025/0608/6388497352726253514384248.png) <br/>
|
||||
|
||||
**开源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)),能将汽车背景更换为黄昏沙滩或赛道,并智能地为行驶中的车轮**添加运动模糊效果**。
|
||||
<br/> [](https://cdnv2.ruguoapp.com/FgYlujbzq6TyHy_7vk80onRQz2s0v3.png) <br/>
|
||||
<br/> [](https://cdnv2.ruguoapp.com/Frl3Mso4Vw3AJ0TMEhauKTMf1KJSv3.png) <br/>
|
||||
4. izx-copy分享了Google的建议([Link](https://m.okjike.com/originalPosts/684547c3380c5253de2afdb8)),鼓励开发者直接使用其高质量的**深度研究代码库**,而非自行开发,认为其比"vibe coding”版本更优。
|
||||
<br/> [](https://cdnv2.ruguoapp.com/Fq5xvk7MirT9ygZ10T5hIx3lWRlvv3.jpg) <br/>
|
||||
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客服,甚至会因此考虑更换竞争对手。
|
||||
<br/> [](https://mmbiz.qpic.cn/mmbiz_jpg/kKoeb9t5fNrx85xJ2bibZStRvd1w55tu3rasGH4r7WyxZ3ECSxozia6DZvicBZcXVKhsUSCSKw47gnesic2RfDztsQ/0?wx_fmt=jpeg) <br/>
|
||||
50
daily/2025-06-10.md
Normal file
50
daily/2025-06-10.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# AI洞察日报 2025/6/10
|
||||
|
||||
**AI产品与功能更新**
|
||||
|
||||
1. Google 近日调整 **AI 模型**使用政策,自5月起,**Google AI Studio** 已停止向免费用户提供 **Gemini 2.5 Pro** 系列模型调用权限,未来开发者需自行提供 **API 密钥**接入服务。此举引发了开发者社区的广泛关注,分析认为这是 Google 推动 **Gemini** 商业化进程、将高性能模型纳入付费体系的信号。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202312070835429226_0.jpg) <br/>
|
||||
|
||||
2. 据官方数据显示,阿里旗下**通义千问3**大模型开源仅一个月,其全球累计下载量已突破**1250万次**,并在 Hugging Face 等主流 **AI** 开源平台上,衍生模型数量超过**13万个**,跃居全球第一。这一爆发式增长不仅代表着国产大模型的开源实力正与国际水平接轨,也进一步巩固了阿里在全球 **AI 基础模型生态**中的影响力。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202504151007248027_6.jpg) <br/>
|
||||
|
||||
3. 轻量级文档解析模型 **MonkeyOCR** 近日震撼登场,它以仅**3B参数**的轻量级架构,在英文文档解析任务中展现出惊艳性能,超越了 **Gemini 2.5 Pro** 等重量级模型,并大幅提升了处理速度。其核心创新在于采用"**结构-识别-关系**”三元组范式,这不仅提升了解析准确率,还显著降低了计算资源需求,为中小型企业部署 **AI** 文档解析解决方案提供了可能。
|
||||
<br/> [](https://upload.chinaz.com/2025/0609/6388506551370676562538551.png) <br/>
|
||||
论文链接:[https://arxiv.org/abs/2506.05218](https://arxiv.org/abs/2506.05218)
|
||||
|
||||
4. 在近期一场采用2025年高考新课标Ⅰ卷客观题的数学挑战中,**字节**的**豆包**和**腾讯**的**元宝**表现出色,以68分的成绩并列第一,充分展现了其在复杂推理场景下的潜力。此次比赛不仅揭示了各大 **AI 模型**在高考数学上的能力与不足,也反映出它们在细节处理、公式应用和逻辑推理方面的显著进步,为未来 **AI 数学能力**的发展奠定了基础。
|
||||
<br/> [](https://upload.chinaz.com/2025/0609/6388506262201100345390287.png) <br/>
|
||||
<br/> [](https://upload.chinaz.com/2025/0609/6388506263798259217980699.png) <br/>
|
||||
|
||||
**AI行业展望与社会影响**
|
||||
|
||||
1. 架构师**罗伯特・卡鲁索**近日进行了一项跨时代实验,结果显示1977年推出的**Atari 2600**游戏机国际象棋引擎轻松击败了 **OpenAI** 的 **ChatGPT**。**ChatGPT** 在比赛中频繁犯错、混淆棋子,这引发了公众对**复古科技**与**现代 AI** 棋艺水平的讨论和反思。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202307141649254569_3.jpg) <br/>
|
||||
|
||||
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** 构建、生产级机器学习应用部署到**提示工程**等关键学习资源。
|
||||
<br/> [](https://pbs.twimg.com/media/Gs-Kw91bEAAfXUe?format=jpg&name=orig) <br/>
|
||||
[Link](https://x.com/shao__meng/status/1931915369754870114)
|
||||
|
||||
**社媒分享**
|
||||
|
||||
1. 博主**归藏**详细介绍了如何在 **Liblib** 平台在线使用 **FLUX Kontext** 工具进行图片修改,无需本地运行 **Comfyui**,并分享了涵盖单图、双图、三图融合及图片放大功能的**工作流**。**Liblib** 上线的 **Kontext** 提供了便捷的在线处理能力,旨在帮助用户轻松掌握图片创作的各种高级技巧。
|
||||
<br/> [](https://cdnv2.ruguoapp.com/FgPX1CCXdu_RYpd92XdLLAZ2RFbBv3.png) <br/>
|
||||
[Link](https://m.okjike.com/originalPosts/68468cf4747af0f12129117c)
|
||||
|
||||
2. **Tw93** 推荐了 **PayQrcode** 方案,该方案通过**物理图片合并技术**,成功将**微信**与**支付宝**收款码融合为单张图片,实现了线下离线场景下的**双码兼容识别**。这项创新解决了传统双码不便的问题,并经本地测试证明识别效果良好,极大地提升了支付便利性。
|
||||
<br/> [](https://pbs.twimg.com/media/Gs7XEppbgAA10Zw?format=jpg&name=orig) <br/>
|
||||
[Link](https://x.com/HiTw93/status/1931860291278823822)
|
||||
47
daily/2025-06-11.md
Normal file
47
daily/2025-06-11.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# AI洞察日报 2025/6/11
|
||||
|
||||
**AI产品与功能更新**
|
||||
1. **豆包大模型家族**将在2025 FORCE原动力大会上,重磅发布全新的**豆包·视频生成模型**。这款模型可谓"创意魔法棒”,它凭借高效结构和多任务统一建模等黑科技,不仅支持**无缝多镜头叙事**,还能**精准响应多动作**,甚至能像专业摄影师一样**随心运镜**,轻松生成写实、动漫等多种风格的**高品质视频**,简直是视频创作者的福音!
|
||||
<br/> [](https://upload.chinaz.com/2025/0610/6388517021358447365987976.png) <br/>
|
||||
2. xAI开发的**Grok**人工智能正大刀阔斧地接管X平台的**推荐算法**,同时优化了评论排序机制。这意味着,平台将优先推荐**高质量内容**,而非仅仅看粉丝量,这无疑给那些粉丝较少但有真材实料的"小号”和新人带来了前所未有的曝光机会,旨在打造一个更公平、更开放的内容生态,让好内容不再"蒙尘”。
|
||||
<br/> [](https://upload.chinaz.com/2025/0610/6388514989498792027745193.png) <br/>
|
||||
3. **豆包App**近期也对"一句话P图”功能进行了全面升级,它基于强大的SeedEdit 3.0模型,新增了一键添加/替换文字、质感风格迁移和局部图像编辑增强等一系列酷炫修图玩法。这波升级简直是把专业修图师请进了手机,让普通用户也能无需专业技能,轻松搞定个性化照片创作,让"修图小白”也能变身"修图大师”。
|
||||
<br/> [](https://upload.chinaz.com/2025/0610/6388514703219058043604298.png) <br/>
|
||||
4. 苹果在WWDC 2025大会上带来了iOS 26系统的"杀手级”功能——**视觉智能**。有了它,你可以在屏幕上的任何图片或信息上进行提问、搜索,甚至自动识别事件详情,简直是手机的"智能眼”。这项升级通过AI技术实现了屏幕内容的"一眼识别”,大大提升了交互体验的便捷性与智能化程度,还能自动提取事件信息加入日历,让你的数字生活更加省心。
|
||||
<br/> [](https://upload.chinaz.com/2025/0610/6388514197880401555868249.png) <br/>
|
||||
5. 好消息!**沉浸式翻译**迎来重大更新,现在已能对**推特(X)视频**进行**实时翻译**。即便视频没有原生字幕,它也能帮你"神同步”地显示**中英双语字幕**。这下,刷X平台视频再也不用担心语言不通了,简直是跨文化交流的"神助攻”,彻底消除了语言障碍,让世界更近。
|
||||
[Link](https://x.com/imxiaohu/status/1932299897388277804)
|
||||
|
||||
**AI前沿研究**
|
||||
1. 香港大学和华为诺亚方舟实验室强强联手,推出了颠覆性的**FUDOKI**模型。这款模型采用**非掩码离散流匹配架构**,成功突破了传统自回归模型的束缚,实现了更加灵活高效的**多模态生成与理解**能力。它通过独特的**并行去噪机制**,显著提升了复杂推理和生成任务的表现,尤其在**图像生成**方面表现惊艳,为未来**通用人工智能**的发展铺平了道路。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202405161743136484_4.jpg) <br/>
|
||||
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)。
|
||||
<br/> [](https://upload.chinaz.com/2025/0610/6388516498517715873339996.png) <br/>
|
||||
<br/> [](https://upload.chinaz.com/2025/0610/6388516503306155376085044.png) <br/>
|
||||
3. 一篇名为"**玩中泛化:通过游戏学习推理**”的学术论文揭示了令人兴奋的发现:**多模态大型语言模型(MLLMs)**通过玩简单的**街机游戏**,竟然能**显著提升其跨领域的多模态推理能力**,甚至超越了在特定数据上训练的**专业模型**!这无疑为未来**通用AI能力的培养**指明了一条充满趣味的新方向,让AI在"玩乐”中变得更聪明。
|
||||
[此链接](https://arxiv.org/abs/2506.08011)
|
||||
4. 新论文《梦境之地》(**Dreamland**)提出了一种结合物理模拟器与大型生成模型的混合框架。它的目标是创造出高度可控且逼真的动态虚拟世界,不仅显著提升了图像质量与可控性,更重要的是,有望为**具身AI智能体**的训练提供一个理想的"游乐场”和"实验室”,助力AI在现实世界中更好地学习和行动。
|
||||
[Link](https://arxiv.org/abs/2506.08006)
|
||||
|
||||
**AI行业展望与社会影响**
|
||||
1. 理想汽车近期进行了组织架构的"大变身”,正式成立了**"空间机器人”**和**"穿戴机器人”**两个全新的二级部门。这不仅仅是部门调整,更预示着理想汽车正从传统的汽车制造商转型为**智能出行生态构建者**。他们旨在通过机器人技术,构建一个涵盖车内"第三空间”和车外智能穿戴设备的完整智能生活服务体系,这无疑将为理想汽车在竞争激烈的市场中带来新的差异化优势,让"第三空间”战略不再只是一个概念。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202105061137083176_6.jpg) <br/>
|
||||
2. 俄亥俄州立大学宣布从今年起,将强制所有学生接受**人工智能(AI)培训**,这简直是为未来职场"量身定制”的技能包!学校推出了**"AI流利度”计划**,将AI教育全面融入本科生课程,旨在培养学生将专业知识与AI技术有效结合的能力。当然,学校也强调学生不得利用生成性AI来"蒙混过关”,同时加强教师培训以维护**学术诚信**。此举旨在确保每位毕业生都能在其专业领域有效应用AI,并积极响应俄亥俄州AI教育联盟在K-12教育中推动AI教育的努力,让AI真正成为每个人的"超级助手”。
|
||||
<br/> [](https://pic.chinaz.com/picmap/202306251749094253_12.jpg) <br/>
|
||||
3. 知名思考者李继刚一针见血地指出,当AI技术变得越发**高效强大**时,人类的**判断力**、**品味**和对事物**目的的理解**反而会变得更为**硬核**。因为AI虽然能生成万千方案并完美执行,却无法替代人类进行**选择**、定义**美**,更无法洞悉复杂且深邃的**人性**。这提醒我们,在AI时代,真正有价值的,或许正是那些AI无法企及的"人类专属技能”。
|
||||
[Link](https://m.okjike.com/originalPosts/68480c352b31fa0880f554c5)
|
||||
|
||||
**开源TOP项目**
|
||||
1. 小红书的 hi lab 团队近日献出了一份"大礼”——首个开源文本大模型**dots.llm1**!这款拥有1420亿参数的**混合专家(MoE)语言模型**,在海量真实数据训练后,其性能竟然能媲美阿里巴巴的Qwen2.5-72B,这简直是模型界的"黑马”!此次开源不仅彰显了小红书在人工智能领域的技术雄心,更旨在提供更智能化的服务,并激励开发者们一起加入AI研究的"大合唱”。
|
||||
<br/> [](https://pic.chinaz.com/picmap/201811151633429180_32.jpg) <br/>
|
||||
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)
|
||||
83
podcast/2025-06-01.md
Normal file
83
podcast/2025-06-01.md
Normal file
@@ -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
|
||||
#长期记忆模块
|
||||
#长序列理解
|
||||
28
podcast/2025-06-02.md
Normal file
28
podcast/2025-06-02.md
Normal file
@@ -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
|
||||
42
podcast/2025-06-03.md
Normal file
42
podcast/2025-06-03.md
Normal file
@@ -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型技能
|
||||
63
podcast/2025-06-04.md
Normal file
63
podcast/2025-06-04.md
Normal file
@@ -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架构
|
||||
69
podcast/2025-06-05.md
Normal file
69
podcast/2025-06-05.md
Normal file
@@ -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
|
||||
128
podcast/2025-06-06.md
Normal file
128
podcast/2025-06-06.md
Normal file
@@ -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参数
|
||||
#个人免费部署使用
|
||||
#不可商用
|
||||
56
podcast/2025-06-07.md
Normal file
56
podcast/2025-06-07.md
Normal file
@@ -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
|
||||
#动态内存稀疏化
|
||||
50
podcast/2025-06-08.md
Normal file
50
podcast/2025-06-08.md
Normal file
@@ -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
|
||||
#作文
|
||||
58
podcast/2025-06-09.md
Normal file
58
podcast/2025-06-09.md
Normal file
@@ -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替代客服
|
||||
#真人客服
|
||||
#用户体验
|
||||
45
podcast/2025-06-10.md
Normal file
45
podcast/2025-06-10.md
Normal file
@@ -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
|
||||
#收款码
|
||||
90
podcast/2025-06-11.md
Normal file
90
podcast/2025-06-11.md
Normal file
@@ -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焦虑
|
||||
#代码质量
|
||||
177
src/auth.js
177
src/auth.js
@@ -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 `
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Login</title>
|
||||
<style>
|
||||
body { font-family: sans-serif; display: flex; justify-content: center; align-items: center; min-height: 100vh; background-color: #f4f4f4; margin: 0; }
|
||||
.login-container { background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); width: 100%; max-width: 400px; text-align: center; }
|
||||
h2 { color: #333; margin-bottom: 20px; }
|
||||
.form-group { margin-bottom: 15px; text-align: left; }
|
||||
label { display: block; margin-bottom: 5px; color: #555; }
|
||||
input[type="text"], input[type="password"] { width: calc(100% - 20px); padding: 10px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; }
|
||||
button { background-color: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; width: 100%; }
|
||||
button:hover { background-color: #0056b3; }
|
||||
.error-message { color: red; margin-top: 10px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="login-container">
|
||||
<h2>Login</h2>
|
||||
<form id="loginForm" method="POST" action="/login">
|
||||
<div class="form-group">
|
||||
<label for="username">Username:</label>
|
||||
<input type="text" id="username" name="username" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="password">Password:</label>
|
||||
<input type="password" id="password" name="password" required>
|
||||
</div>
|
||||
<input type="hidden" name="redirect" value="${redirectUrl}">
|
||||
<button type="submit">Login</button>
|
||||
<p id="errorMessage" class="error-message"></p>
|
||||
</form>
|
||||
<script>
|
||||
const form = document.getElementById('loginForm');
|
||||
const errorMessage = document.getElementById('errorMessage');
|
||||
form.addEventListener('submit', async (event) => {
|
||||
event.preventDefault();
|
||||
const formData = new FormData(form);
|
||||
const response = await fetch('/login', {
|
||||
method: 'POST',
|
||||
body: new URLSearchParams(formData).toString(),
|
||||
headers: {
|
||||
'Content-Type': 'application/x-www-form-urlencoded'
|
||||
}
|
||||
});
|
||||
if (response.ok) {
|
||||
const redirectUrl = response.headers.get('X-Redirect-Url');
|
||||
if (redirectUrl && redirectUrl !== '/') {
|
||||
window.location.href = redirectUrl;
|
||||
} else {
|
||||
window.location.href = '/getContentHtml'; // Fallback to home
|
||||
}
|
||||
} else {
|
||||
const errorText = await response.text();
|
||||
errorMessage.textContent = errorText || 'Login failed. Please try again.';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
}
|
||||
|
||||
// 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,
|
||||
};
|
||||
567
src/chatapi.js
567
src/chatapi.js
@@ -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<string>} 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<string, void, undefined>} 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<string>} 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<string, void, undefined>} 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<string>} 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<string, void, undefined>} 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);
|
||||
}
|
||||
}
|
||||
@@ -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<Array<object>>} 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<object>} 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<Array<object>>} 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);
|
||||
}
|
||||
@@ -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 `
|
||||
<strong>${escapeHtml(item.title)}</strong><br>
|
||||
<small>来源: ${escapeHtml(item.source || '未知')} | 发布日期: ${formatDateToChineseWithTime(item.published_date)}</small>
|
||||
<div class="content-html">${item.details.content_html || '无内容。'}</div>
|
||||
<a href="${escapeHtml(item.url)}" target="_blank" rel="noopener noreferrer">阅读更多</a>
|
||||
`;
|
||||
}
|
||||
};
|
||||
|
||||
export default NewsDataSource;
|
||||
@@ -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 `
|
||||
<strong>${escapeHtml(item.title)}</strong> (所有者: ${escapeHtml(item.details.owner)})<br>
|
||||
<small>星标: ${escapeHtml(item.details.totalStars)} (今日: ${escapeHtml(item.details.starsToday)}) | 语言: ${escapeHtml(item.details.language || 'N/A')}</small>
|
||||
描述: ${escapeHtml(item.description) || 'N/A'}<br>
|
||||
<a href="${escapeHtml(item.url)}" target="_blank" rel="noopener noreferrer">在 GitHub 上查看</a>
|
||||
`;
|
||||
}
|
||||
};
|
||||
|
||||
export default ProjectsDataSource;
|
||||
@@ -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 `
|
||||
<strong>${escapeHtml(item.title)}</strong><br>
|
||||
<small>来源: ${escapeHtml(item.source || '未知')} | 发布日期: ${formatDateToChineseWithTime(item.published_date)}</small>
|
||||
<div class="content-html">
|
||||
${item.details.content_html || '无内容。'}<hr>
|
||||
</div>
|
||||
<a href="${escapeHtml(item.url)}" target="_blank" rel="noopener noreferrer">在 ArXiv/来源 阅读</a>
|
||||
`;
|
||||
}
|
||||
};
|
||||
|
||||
export default PapersDataSource;
|
||||
@@ -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 `
|
||||
<strong>${escapeHtml(item.title)}</strong><br>
|
||||
<small>来源: ${escapeHtml(item.source || '未知')} | 发布日期: ${formatDateToChineseWithTime(item.published_date)}</small>
|
||||
<div class="content-html">
|
||||
${item.details.content_html || '无内容。'}
|
||||
</div>
|
||||
<a href="${escapeHtml(item.url)}" target="_blank" rel="noopener noreferrer">查看推文</a>
|
||||
`;
|
||||
}
|
||||
};
|
||||
|
||||
export default TwitterDataSource;
|
||||
@@ -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 `
|
||||
<strong>${escapeHtml(item.title)}</strong><br>
|
||||
<small>来源: ${escapeHtml(item.source || '未知')} | 发布日期: ${formatDateToChineseWithTime(item.published_date)}</small>
|
||||
<div class="content-html">${item.details.content_html || '无内容。'}</div>
|
||||
<a href="${escapeHtml(item.url)}" target="_blank" rel="noopener noreferrer">阅读更多</a>
|
||||
`;
|
||||
}
|
||||
};
|
||||
|
||||
export default XiaohuDataSource;
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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' } });
|
||||
}
|
||||
}
|
||||
@@ -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播客脚本出错', '<p><strong>Summarized content is missing.</strong> Please go back and generate AI content first.</p>', 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播客脚本出错(播客文案)', `<p><strong>Failed during podcast formatting:</strong> ${escapeHtml(error.message)}</p>${error.stack ? `<pre>${escapeHtml(error.stack)}</pre>` : ''}`, 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播客脚本出错', `<p><strong>Unexpected error:</strong> ${escapeHtml(error.message)}</p>${error.stack ? `<pre>${escapeHtml(error.stack)}</pre>` : ''}`, 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日报出错,未选生成条目', '<p><strong>No items were selected.</strong> Please go back and select at least one item.</p>', 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日报出错,可生成条目为空', '<p><strong>Selected items could not be retrieved or resulted in no content.</strong> Please check the data or try different selections.</p>', 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日报出错(分段处理)', `<p><strong>Failed during summarization:</strong> ${escapeHtml(error.message)}</p>${error.stack ? `<pre>${escapeHtml(error.stack)}</pre>` : ''}`, 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日报出错(格式化)', `<p><strong>Failed during processing of summarized content:</strong> ${escapeHtml(error.message)}</p>${error.stack ? `<pre>${escapeHtml(error.stack)}</pre>` : ''}`, 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日报出错', `<p><strong>Unexpected error:</strong> ${escapeHtml(error.message)}</p>${error.stack ? `<pre>${escapeHtml(error.stack)}</pre>` : ''}`, 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' } });
|
||||
}
|
||||
}
|
||||
@@ -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' }
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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(`<h1>Error generating HTML content</h1><p>${escapeHtml(error.message)}</p><pre>${escapeHtml(error.stack)}</pre>`, {
|
||||
status: 500, headers: { 'Content-Type': 'text/html; charset=utf-8' }
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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' }
|
||||
});
|
||||
}
|
||||
}
|
||||
246
src/helpers.js
246
src/helpers.js
@@ -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<object>} 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(/<img[^>]*src="([^"]*)"[^>]*alt="([^"]*)"[^>]*>/gi, (match, src, alt) => {
|
||||
return alt ? `[图片: ${alt} ${src}]` : `[图片: ${src}]`;
|
||||
});
|
||||
processedHtml = processedHtml.replace(/<img[^>]*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<void>} A promise that resolves after the specified time.
|
||||
*/
|
||||
export function sleep(ms) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
@@ -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 += `<p>此日期无可用数据。抓取/筛选过程可能没有为此日期生成任何结果。</p>`;
|
||||
return listHtml;
|
||||
}
|
||||
|
||||
listHtml += '<ul class="item-list">';
|
||||
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 = `<strong>未知项目类型: ${escapeHtml(item.type)}</strong><br>${escapeHtml(item.title || item.description || JSON.stringify(item))}`;
|
||||
}
|
||||
|
||||
listHtml += `<li class="item-card">
|
||||
<label>
|
||||
<input type="checkbox" name="selectedItems" value="${item.type}:${itemId}" class="item-checkbox">
|
||||
<div class="item-content">${displayContent}</div>
|
||||
</label>
|
||||
</li>`;
|
||||
});
|
||||
listHtml += '</ul>';
|
||||
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) => `
|
||||
<div class="tab-buttons-wrapper">
|
||||
<button type="button" class="tab-button ${index === 0 ? 'active' : ''}" onclick="openTab(event, '${category.id}-tab')" ondblclick="confirmFetchCategoryData(this,'${category.id}')">${escapeHtml(category.name)}</button>
|
||||
</div>
|
||||
`).join('');
|
||||
|
||||
const tabContentsHtml = categories.map((category, index) => `
|
||||
<div id="${category.id}-tab" class="tab-content ${index === 0 ? 'active' : ''}">
|
||||
${generateHtmlListForContentPage(data[category.id], dateStr)}
|
||||
</div>
|
||||
`).join('');
|
||||
|
||||
return `
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-Hans">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>${formatDateToChinese(escapeHtml(dateStr))} ${env.FOLO_FILTER_DAYS}天内的数据</title>
|
||||
<style>
|
||||
:root { --primary-color: #007bff; --light-gray: #f8f9fa; --medium-gray: #e9ecef; --dark-gray: #343a40; --line-height-normal: 1.4; --font-size-small: 0.9rem;}
|
||||
* { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; line-height: 1.6; background-color: var(--light-gray); color: var(--dark-gray); padding: 1rem; }
|
||||
.container { max-width: 1200px; margin: 0 auto; background-color: #fff; padding: 1rem; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
|
||||
.header-bar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; flex-wrap: wrap; gap: 1rem; }
|
||||
h1 { font-size: 1.8rem; color: var(--dark-gray); margin-bottom: 0.5rem; }
|
||||
.submit-button { background-color: var(--primary-color); color: white; border: none; padding: 0.6rem 1.2rem; font-size: 0.9rem; border-radius: 5px; cursor: pointer; transition: background-color 0.2s; white-space: nowrap; }
|
||||
.submit-button:hover { background-color: #0056b3; }
|
||||
.tab-navigation { display: flex; flex-wrap: wrap; margin-bottom: 1rem; border-bottom: 1px solid var(--medium-gray); }
|
||||
.tab-buttons-wrapper { display: flex; align-items: center; margin-right: 1rem; margin-bottom: 0.5rem; }
|
||||
.tab-button { background-color: transparent; border: none; border-bottom: 3px solid transparent; padding: 0.8rem 1rem; cursor: pointer; font-size: 1rem; color: #555; transition: color 0.2s, border-color 0.2s; }
|
||||
.tab-button.active { color: var(--primary-color); border-bottom-color: var(--primary-color); font-weight: 600; }
|
||||
.tab-button:hover { color: var(--primary-color); }
|
||||
.tab-content { display: none; animation: fadeIn 0.5s; }
|
||||
.tab-content.active { display: block; }
|
||||
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
|
||||
.item-list { list-style-type: none; counter-reset: item-counter; padding-left: 0; }
|
||||
.item-card { margin-bottom: 1rem; padding: 1rem; padding-left: 3em; border: 1px solid var(--medium-gray); border-radius: 6px; background-color: #fff; position: relative; counter-increment: item-counter; }
|
||||
.item-card::before { content: counter(item-counter) "."; position: absolute; left: 0.8em; top: 1rem; font-weight: 600; color: var(--dark-gray); min-width: 1.5em; text-align: right; }
|
||||
.item-card label { display: flex; align-items: flex-start; cursor: pointer; }
|
||||
.item-checkbox { margin-right: 0.8rem; margin-top: 0.2rem; transform: scale(1.2); flex-shrink: 0; }
|
||||
.item-content { flex-grow: 1; min-width: 0; }
|
||||
.item-content strong { font-size: 1.1rem; }
|
||||
.item-content small { color: #6c757d; display: block; margin: 0.2rem 0; }
|
||||
.content-html { border: 1px dashed #ccc; padding: 0.5rem; margin-top: 0.5rem; background: #fdfdfd; font-size: var(--font-size-small); line-height: var(--line-height-normal); max-width: 100%; overflow-wrap: break-word; word-break: break-word; overflow-y: hidden; transition: max-height 0.35s ease-in-out; position: relative; }
|
||||
.content-html.is-collapsed { max-height: calc(var(--font-size-small) * var(--line-height-normal) * 6 + 1rem); }
|
||||
.content-html.is-expanded { max-height: 3000px; overflow-y: auto; }
|
||||
.read-more-btn { display: block; margin-top: 0.5rem; padding: 0.3rem 0.6rem; font-size: 0.85rem; color: var(--primary-color); background-color: transparent; border: 1px solid var(--primary-color); border-radius: 4px; cursor: pointer; text-align: center; width: fit-content; }
|
||||
.read-more-btn:hover { background-color: #eef; }
|
||||
.item-content a { color: var(--primary-color); text-decoration: none; }
|
||||
.item-content a:hover { text-decoration: underline; }
|
||||
.error { color: #dc3545; font-weight: bold; background-color: #f8d7da; padding: 0.5rem; border-radius: 4px; border: 1px solid #f5c6cb;}
|
||||
hr { border: 0; border-top: 1px solid var(--medium-gray); margin: 0.5rem 0; }
|
||||
@media (max-width: 768px) {
|
||||
body { padding: 0.5rem; } .container { padding: 0.8rem; } h1 { font-size: 1.5rem; }
|
||||
.header-bar { flex-direction: column; align-items: flex-start; }
|
||||
.submit-button { margin-top: 0.5rem; width: 100%; }
|
||||
.tab-button { padding: 0.7rem 0.5rem; font-size: 0.9rem; flex-grow: 1; text-align: center; }
|
||||
.item-card { padding-left: 2.5em; } .item-card::before { left: 0.5em; top: 0.8rem; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<form action="/genAIContent" method="POST">
|
||||
<input type="hidden" name="date" value="${escapeHtml(dateStr)}">
|
||||
<div class="header-bar">
|
||||
<button type="button" class="submit-button" onclick="confirmFetchAndWriteData(this)">抓取并写入今日数据</button>
|
||||
<h1>${formatDateToChinese(escapeHtml(dateStr))} ${env.FOLO_FILTER_DAYS}天内的数据</h1>
|
||||
<button type="submit" class="submit-button" onclick="return confirmGenerateAIContent(event)">从选中内容生成 AI 日报</button>
|
||||
</div>
|
||||
<div class="cookie-setting-area" style="margin-bottom: 1rem; padding: 0.8rem; border: 1px solid var(--medium-gray); border-radius: 6px; background-color: #fefefe;">
|
||||
<label for="foloCookie" style="font-weight: bold; margin-right: 0.5rem;">Folo Cookie:</label>
|
||||
<input type="text" id="foloCookie" placeholder="在此输入 Folo Cookie" style="flex-grow: 1; padding: 0.4rem; border: 1px solid #ccc; border-radius: 4px; width: 300px; max-width: 70%;">
|
||||
<button type="button" class="submit-button" onclick="saveFoloCookie(this)" style="margin-left: 0.5rem; padding: 0.4rem 0.8rem; font-size: 0.85rem;">保存 Cookie</button>
|
||||
<p style="font-size: 0.8rem; color: #666; margin-top: 0.5rem;">此 Cookie 将保存在您的浏览器本地存储中,以便下次使用。</p>
|
||||
</div>
|
||||
<div class="tab-navigation">
|
||||
${tabButtonsHtml}
|
||||
</div>
|
||||
${tabContentsHtml}
|
||||
</form>
|
||||
</div>
|
||||
<script>
|
||||
function openTab(evt, tabName) {
|
||||
var i, tabcontent, tablinks;
|
||||
tabcontent = document.getElementsByClassName("tab-content");
|
||||
for (i = 0; i < tabcontent.length; i++) { tabcontent[i].style.display = "none"; tabcontent[i].classList.remove("active"); }
|
||||
tablinks = document.getElementsByClassName("tab-button");
|
||||
for (i = 0; i < tablinks.length; i++) { tablinks[i].classList.remove("active"); }
|
||||
document.getElementById(tabName).style.display = "block"; document.getElementById(tabName).classList.add("active");
|
||||
if (evt && evt.currentTarget) { evt.currentTarget.classList.add("active"); }
|
||||
}
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
if (document.querySelector('.tab-button') && !document.querySelector('.tab-button.active')) { document.querySelector('.tab-button').click(); }
|
||||
else if (document.querySelector('.tab-content.active') === null && document.querySelector('.tab-content')) {
|
||||
const firstTabButton = document.querySelector('.tab-button'); const firstTabContent = document.querySelector('.tab-content');
|
||||
if (firstTabButton) firstTabButton.classList.add('active');
|
||||
if (firstTabContent) { firstTabContent.style.display = 'block'; firstTabContent.classList.add('active');}
|
||||
}
|
||||
document.querySelectorAll('.content-html').forEach(contentDiv => {
|
||||
contentDiv.classList.add('is-collapsed');
|
||||
requestAnimationFrame(() => {
|
||||
const readMoreBtn = document.createElement('button'); readMoreBtn.type = 'button';
|
||||
readMoreBtn.textContent = '展开'; readMoreBtn.className = 'read-more-btn';
|
||||
contentDiv.insertAdjacentElement('afterend', readMoreBtn);
|
||||
readMoreBtn.addEventListener('click', function() {
|
||||
contentDiv.classList.toggle('is-expanded'); contentDiv.classList.toggle('is-collapsed', !contentDiv.classList.contains('is-expanded'));
|
||||
this.textContent = contentDiv.classList.contains('is-expanded') ? '折叠' : '展开';
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
async function saveFoloCookie(button) {
|
||||
const cookieInput = document.getElementById('foloCookie');
|
||||
const cookieValue = cookieInput.value;
|
||||
|
||||
if (!cookieValue.trim()) {
|
||||
alert('Folo Cookie 不能为空。');
|
||||
return;
|
||||
}
|
||||
|
||||
const originalButtonText = button.textContent;
|
||||
button.textContent = '保存中...';
|
||||
button.disabled = true;
|
||||
|
||||
try {
|
||||
localStorage.setItem('${env.FOLO_COOKIE_KV_KEY}', cookieValue); // 直接保存到 localStorage
|
||||
alert('Folo Cookie 已成功保存在本地存储!');
|
||||
} catch (error) {
|
||||
console.error('Error saving Folo Cookie to localStorage:', error);
|
||||
alert(\`保存 Folo Cookie 到本地存储时发生错误: \${error.message}\`);
|
||||
} finally {
|
||||
button.textContent = originalButtonText;
|
||||
button.disabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const savedCookie = localStorage.getItem('${env.FOLO_COOKIE_KV_KEY}');
|
||||
if (savedCookie) {
|
||||
document.getElementById('foloCookie').value = savedCookie;
|
||||
}
|
||||
});
|
||||
|
||||
function confirmFetchAndWriteData(button) {
|
||||
if (confirm('确定要抓取并写入今日数据吗?此操作将更新今日数据。')) {
|
||||
fetchAndWriteData(button);
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchAndWriteData(button, category = null) {
|
||||
const originalText = button.textContent;
|
||||
button.textContent = '正在抓取和写入...';
|
||||
button.disabled = true;
|
||||
|
||||
const foloCookie = localStorage.getItem('${env.FOLO_COOKIE_KV_KEY}'); // 从 localStorage 获取 foloCookie
|
||||
|
||||
try {
|
||||
const response = await fetch('/writeData', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ category: category, foloCookie: foloCookie }), // 将 foloCookie 添加到请求体
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
const result = await response.text();
|
||||
alert('数据抓取和写入成功!' + result);
|
||||
window.location.reload();
|
||||
} else {
|
||||
const errorText = await response.text();
|
||||
alert('数据抓取和写入失败: ' + errorText);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error fetching and writing data:', error);
|
||||
alert('请求失败,请检查网络或服务器。');
|
||||
} finally {
|
||||
button.textContent = originalText;
|
||||
button.disabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
function confirmFetchCategoryData(button, category) {
|
||||
if (confirm(\`确定要抓取并写入 \${category} 分类的数据吗?此操作将更新 \${category} 数据。\`)) {
|
||||
fetchAndWriteData(button, category);
|
||||
}
|
||||
}
|
||||
|
||||
function confirmGenerateAIContent(event) {
|
||||
const selectedCheckboxes = document.querySelectorAll('input[name="selectedItems"]:checked');
|
||||
if (selectedCheckboxes.length === 0) {
|
||||
alert('请至少选择一个内容条目来生成 AI 日报。');
|
||||
event.preventDefault(); // Prevent form submission
|
||||
return false;
|
||||
}
|
||||
if (confirm('确定要从选中内容生成 AI 日报吗?此操作将调用 AI 模型生成内容。')) {
|
||||
return true; // Allow form submission
|
||||
} else {
|
||||
event.preventDefault(); // Prevent form submission
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
`;
|
||||
}
|
||||
|
||||
|
||||
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 `
|
||||
<div style="margin-top: 1rem; border: 1px solid #ddd; padding: 0.8rem; border-radius: 4px; background-color: #f9f9f9;">
|
||||
<h3 style="font-size: 1.1rem; margin-bottom: 0.5rem; color: #333;">${escapeHtml(promptTitle)}</h3>
|
||||
<button type="button" class="button-link toggle-prompt-btn" onclick="togglePromptVisibility('promptDetails_${promptIdSuffix}', this)">显示提示详情</button>
|
||||
<button type="button" class="button-link copy-prompt-btn" onclick="copyToClipboard(this.dataset.fullPrompt, this)" data-full-prompt="${escapeHtml(fullPromptTextForCopy)}">复制完整提示</button>
|
||||
<div id="promptDetails_${promptIdSuffix}" class="content-box" style="display: none; margin-top: 0.5rem; background-color: #e9ecef; border-color: #ced4da; max-height: 400px; overflow-y: auto; text-align: left;">
|
||||
${systemPrompt ? `<strong>系统指令:</strong><pre style="white-space: pre-wrap; word-wrap: break-word; font-size: 0.85rem; margin-top:0.2em; margin-bottom:0.8em; padding: 0.5em; background: #fff; border: 1px solid #ccc; border-radius: 3px;">${escapeHtml(systemPrompt)}</pre>` : '<p><em>本次调用无系统指令。</em></p>'}
|
||||
${userPrompt ? `<strong>用户输入:</strong><pre style="white-space: pre-wrap; word-wrap: break-word; font-size: 0.85rem; margin-top:0.2em; padding: 0.5em; background: #fff; border: 1px solid #ccc; border-radius: 3px;">${escapeHtml(userPrompt)}</pre>` : '<p><em>本次调用无用户输入。</em></p>'}
|
||||
</div>
|
||||
</div>`;
|
||||
}
|
||||
|
||||
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 = `
|
||||
<form action="/genAIContent" method="POST" style="display: inline-block; margin-left: 0.5rem;">
|
||||
<input type="hidden" name="date" value="${escapeHtml(pageDate)}">
|
||||
${selectedItemsForAction.map(item => `<input type="hidden" name="selectedItems" value="${escapeHtml(item)}">`).join('')}
|
||||
<button type="submit" class="button-link regenerate-button">${isErrorPage ? '重试生成' : '重新生成'}</button>
|
||||
</form>`;
|
||||
}
|
||||
// Regenerate button for AI Podcast Script page
|
||||
else if (title.includes('AI播客') && selectedItemsForAction && Array.isArray(selectedItemsForAction) && selectedItemsForAction.length > 0) {
|
||||
actionButtonHtml = `
|
||||
<form action="/genAIPodcastScript" method="POST" style="display: inline-block; margin-left: 0.5rem;">
|
||||
<input type="hidden" name="date" value="${escapeHtml(pageDate)}">
|
||||
${selectedItemsForAction.map(item => `<input type="hidden" name="selectedItems" value="${escapeHtml(item)}">`).join('')}
|
||||
<input type="hidden" name="summarizedContent" value="${escapeHtml(convertEnglishQuotesToChinese(dailyMd))}">
|
||||
<button type="submit" class="button-link regenerate-button">${isErrorPage ? '重试生成' : '重新生成'}</button>
|
||||
</form>`;
|
||||
}
|
||||
|
||||
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 = `
|
||||
<input type="hidden" id="promptsMdCall1" value="${escapeHtml(promptsMd)}">
|
||||
<input type="hidden" id="dailyMd" value="${escapeHtml(dailyMd)}">
|
||||
<button type="button" class="button-link github-save-button" onclick="commitToGitHub('${pageDate}', 'daily')">保存提示词和日报到 GitHub</button>`;
|
||||
} else if (title === 'AI播客脚本' && promptsMd && podcastMd) {
|
||||
githubSaveFormHtml = `
|
||||
<input type="hidden" id="promptsMdCall2" value="${escapeHtml(promptsMd)}">
|
||||
<input type="hidden" id="podcastMd" value="${escapeHtml(podcastMd)}">
|
||||
<button type="button" class="button-link github-save-button" onclick="commitToGitHub('${pageDate}', 'podcast')">保存提示词和播客到 GitHub</button>`;
|
||||
}
|
||||
}
|
||||
|
||||
if (title === 'AI日报' && !isErrorPage && podcastMd === null) { // podcastMd === null indicates it's the Call 1 page
|
||||
generatePodcastButtonHtml = `
|
||||
<form action="/genAIPodcastScript" method="POST" style="display: inline-block; margin-left: 0.5rem;">
|
||||
<input type="hidden" name="date" value="${escapeHtml(pageDate)}">
|
||||
${selectedItemsForAction.map(item => `<input type="hidden" name="selectedItems" value="${escapeHtml(item)}">`).join('')}
|
||||
<input type="hidden" name="summarizedContent" value="${escapeHtml(convertEnglishQuotesToChinese(bodyContent))}">
|
||||
<button type="submit" class="button-link">生成播客脚本</button>
|
||||
</form>`;
|
||||
aiDailyAnalysisButtonHtml = `
|
||||
<input type="hidden" id="summarizedContentInput" value="${escapeHtml(convertEnglishQuotesToChinese(bodyContent))}">
|
||||
<button type="button" class="button-link" onclick="generateAIDailyAnalysis('${escapeHtml(pageDate)}')">AI 日报分析</button>
|
||||
`;
|
||||
}
|
||||
|
||||
let promptDisplayHtml = '';
|
||||
if (title === 'AI日报') {
|
||||
if (systemP1 || userP1) {
|
||||
promptDisplayHtml = `
|
||||
<div style="margin-top: 1.5rem;">
|
||||
<h2 style="font-size:1.3rem; margin-bottom:0.5rem;">API 调用详情</h2>
|
||||
${generatePromptSectionHtmlForGenAI(convertEnglishQuotesToChinese(systemP1), convertEnglishQuotesToChinese(userP1), '调用 1: 日报', 'call1')}
|
||||
</div>`;
|
||||
}
|
||||
} else if (title === 'AI播客脚本') {
|
||||
if (systemP2 || userP2) {
|
||||
promptDisplayHtml = `
|
||||
<div style="margin-top: 1.5rem;">
|
||||
<h2 style="font-size:1.3rem; margin-bottom:0.5rem;">API 调用详情</h2>
|
||||
${generatePromptSectionHtmlForGenAI(convertEnglishQuotesToChinese(systemP2), convertEnglishQuotesToChinese(userP2), '调用 2: 播客格式化', 'call2')}
|
||||
</div>`;
|
||||
}
|
||||
}
|
||||
|
||||
return `
|
||||
<!DOCTYPE html><html lang="zh-Hans"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>${escapeHtml(title)}</title>
|
||||
<style>
|
||||
:root { --primary-color: #007bff; --light-gray: #f8f9fa; --medium-gray: #e9ecef; --dark-gray: #343a40; --retry-color: #ffc107; --retry-text-color: #212529; --info-color: #17a2b8; --github-green: #28a745;}
|
||||
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; line-height: 1.6; background-color: var(--light-gray); color: var(--dark-gray); padding: 1rem; }
|
||||
.container { max-width: 900px; margin: 0 auto; background-color: #fff; padding: 1.5rem; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
|
||||
h1 { font-size: 1.8rem; color: ${isErrorPage ? '#dc3545' : 'var(--dark-gray)'}; margin-bottom: 0.5rem; }
|
||||
p { margin-bottom: 1rem; }
|
||||
.content-box { margin-top: 1.5rem; padding: 1rem; background-color: ${isErrorPage ? '#f8d7da' : '#f0f9ff'}; border: 1px solid ${isErrorPage ? '#f5c6cb' : '#cce7ff'}; color: ${isErrorPage ? '#721c24' : 'var(--dark-gray)'}; border-radius: 6px; white-space: pre-wrap; word-wrap: break-word; line-height: 1.5; font-family: ${isErrorPage ? 'inherit' : 'Menlo, Monaco, Consolas, "Courier New", monospace'}; font-size: ${isErrorPage ? '1rem' : '0.95rem'};}
|
||||
.header-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; justify-content: flex-end; align-items: center; margin-bottom: 1rem; }
|
||||
.navigation-links { margin-top: 1.5rem; }
|
||||
.button-link { display: inline-block; background-color: var(--primary-color); color: white; border: none; padding: 0.6rem 1.2rem; font-size: 0.9rem; border-radius: 5px; cursor: pointer; text-decoration: none; transition: background-color 0.2s; margin-right: 0.5rem; margin-bottom: 0.5rem;}
|
||||
.button-link:hover { background-color: #0056b3; }
|
||||
.regenerate-button { background-color: ${isErrorPage ? 'var(--retry-color)' : 'var(--info-color)'}; color: ${isErrorPage ? 'var(--retry-text-color)' : 'white'}; }
|
||||
.regenerate-button:hover { background-color: ${isErrorPage ? '#e0a800' : '#138496'}; }
|
||||
.github-save-button { background-color: var(--github-green); }
|
||||
.github-save-button:hover { background-color: #218838; }
|
||||
.toggle-prompt-btn { background-color: #6c757d; font-size: 0.85rem; padding: 0.4rem 0.8rem;}
|
||||
.toggle-prompt-btn:hover { background-color: #5a6268; }
|
||||
.copy-prompt-btn { background-color: #17a2b8; font-size: 0.85rem; padding: 0.4rem 0.8rem;}
|
||||
.copy-prompt-btn:hover { background-color: #138496;}
|
||||
</style>
|
||||
</head><body><div class="container">
|
||||
<div class="header-bar" style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.5rem; flex-wrap: wrap; gap: 1rem;">
|
||||
<h1>${escapeHtml(title)}</h1>
|
||||
<div class="header-actions">
|
||||
${generatePodcastButtonHtml}
|
||||
${aiDailyAnalysisButtonHtml}
|
||||
</div>
|
||||
</div>
|
||||
<p>所选内容日期: <strong>${formatDateToChinese(escapeHtml(pageDate))}</strong></p>
|
||||
<div class="content-box">${bodyContent}</div>
|
||||
${promptDisplayHtml}
|
||||
<div class="navigation-links">
|
||||
<a href="/getContentHtml?date=${encodeURIComponent(pageDate)}" class="button-link">返回内容选择</a>
|
||||
${actionButtonHtml}
|
||||
${githubSaveFormHtml}
|
||||
<div id="dailyAnalysisResult" style="margin-top: 1rem; padding: 1rem; border: 1px solid #ccc; border-radius: 5px; background-color: #f9f9f9; display: none;"></div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
function togglePromptVisibility(elementId, buttonElement) {
|
||||
const promptDiv = document.getElementById(elementId);
|
||||
if (promptDiv) {
|
||||
promptDiv.style.display = (promptDiv.style.display === 'none') ? 'block' : 'none';
|
||||
if (buttonElement) buttonElement.textContent = (promptDiv.style.display === 'none') ? '显示提示详情' : '隐藏提示详情';
|
||||
}
|
||||
}
|
||||
function copyToClipboard(textToCopy, buttonElement) {
|
||||
if (!textToCopy) { alert("Nothing to copy."); return; }
|
||||
navigator.clipboard.writeText(textToCopy).then(() => {
|
||||
const originalText = buttonElement.textContent;
|
||||
buttonElement.textContent = '已复制!'; buttonElement.style.backgroundColor = '#28a745';
|
||||
setTimeout(() => { buttonElement.textContent = originalText; buttonElement.style.backgroundColor = '#17a2b8'; }, 2000);
|
||||
}, (err) => { console.error('Async: Could not copy text: ', err); alert('复制提示失败。'); });
|
||||
}
|
||||
|
||||
async function commitToGitHub(date, type) {
|
||||
const button = event.target;
|
||||
const originalText = button.textContent;
|
||||
button.textContent = '保存中...';
|
||||
button.disabled = true;
|
||||
|
||||
const formData = new FormData();
|
||||
formData.append('date', date);
|
||||
|
||||
if (type === 'daily') {
|
||||
formData.append('prompts_markdown-1', document.getElementById('promptsMdCall1').value);
|
||||
formData.append('daily_summary_markdown', document.getElementById('dailyMd').value);
|
||||
} else if (type === 'podcast') {
|
||||
formData.append('prompts_markdown-2', document.getElementById('promptsMdCall2').value);
|
||||
formData.append('podcast_script_markdown', document.getElementById('podcastMd').value);
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch('/commitToGitHub', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
if (response.ok) {
|
||||
alert('GitHub 提交成功!');
|
||||
console.log('GitHub Commit Success:', result);
|
||||
} else {
|
||||
alert('GitHub 提交失败: ' + result.message);
|
||||
console.error('GitHub Commit Failed:', result);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error committing to GitHub:', error);
|
||||
alert('请求失败,请检查网络或服务器。');
|
||||
} finally {
|
||||
button.textContent = originalText;
|
||||
button.disabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function generateAIDailyAnalysis(date) {
|
||||
const button = event.target;
|
||||
const originalText = button.textContent;
|
||||
button.textContent = '正在分析...';
|
||||
button.disabled = true;
|
||||
const analysisResultDiv = document.getElementById('dailyAnalysisResult');
|
||||
analysisResultDiv.style.display = 'none'; // Hide previous result
|
||||
analysisResultDiv.innerHTML = ''; // Clear previous result
|
||||
|
||||
const summarizedContent = document.getElementById('summarizedContentInput').value; // Get summarized content from hidden input
|
||||
|
||||
try {
|
||||
const response = await fetch('/genAIDailyAnalysis', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ date: date, summarizedContent: summarizedContent })
|
||||
});
|
||||
|
||||
if (response.ok) {
|
||||
const result = await response.text();
|
||||
analysisResultDiv.innerHTML = \`<h2>AI 日报分析结果</h2><div class="content-box">\${result}</div>\`;
|
||||
analysisResultDiv.style.display = 'block';
|
||||
//alert('AI 日报分析成功!');
|
||||
} else {
|
||||
const errorText = await response.text();
|
||||
analysisResultDiv.innerHTML = \`<h2>AI 日报分析失败</h2><div class="content-box error">\${errorText}</div>\`;
|
||||
analysisResultDiv.style.display = 'block';
|
||||
alert('AI 日报分析失败: ' + errorText);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error generating AI daily analysis:', error);
|
||||
analysisResultDiv.innerHTML = \`<h2>AI 日报分析失败</h2><div class="content-box error">请求失败,请检查网络或服务器。错误: \${escapeHtml(error.message)}</div>\`;
|
||||
analysisResultDiv.style.display = 'block';
|
||||
alert('请求失败,请检查网络或服务器。');
|
||||
} finally {
|
||||
button.textContent = originalText;
|
||||
button.disabled = false;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body></html>`;
|
||||
}
|
||||
102
src/index.js
102
src/index.js
@@ -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 = `
|
||||
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Configuration Error</title></head>
|
||||
<body style="font-family: sans-serif; padding: 20px;"><h1>Server Configuration Error</h1>
|
||||
<p>Essential environment variables or bindings are missing: ${missingVars.join(', ')}. The service cannot operate.</p>
|
||||
<p>Please contact the administrator.</p></body></html>`;
|
||||
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;
|
||||
}
|
||||
};
|
||||
12
src/kv.js
12
src/kv.js
@@ -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;
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
export function getSystemPromptDailyAnalysis() {
|
||||
return `
|
||||
请您扮演一位拥有10年以上经验的资深AI行业分析师。
|
||||
您的任务是针对下方提供的AI相关内容(可能包括但不限于AI领域的新闻报道、学术论文摘要或全文、社会热点现象讨论、社交媒体上的关键意见、或开源项目的技术文档/介绍)进行一次深入、专业且全面的分析。
|
||||
您的分析报告应力求正式、客观、并带有批判性视角,同时不失前瞻性和深刻洞察力。
|
||||
请将您的分析结果组织成一份结构清晰的报告,至少包含以下核心部分。在每个部分中,请用精炼的语言阐述关键洞察,可适当使用分点进行表述:
|
||||
AI内容分析报告
|
||||
核心内容摘要与AI相关性解读:
|
||||
简明扼要地总结所提供内容的核心信息。
|
||||
明确指出该内容与人工智能领域的关联性,及其探讨的AI核心要素。
|
||||
技术创新性与可行性评估:
|
||||
创新性分析: 评估内容中所涉及的AI技术、算法、模型或概念的新颖程度和独特性。是现有技术的迭代改进,还是颠覆性的创新?
|
||||
技术可行性: 分析所讨论的技术在当前技术水平下实现的可能性、成熟度、技术壁垒以及规模化应用的潜在挑战。
|
||||
市场潜力与商业模式洞察:
|
||||
分析其可能开拓的市场空间、目标用户群体及其规模。
|
||||
探讨其潜在的商业化路径、可能的盈利模式及其可持续性。
|
||||
对现有行业格局的影响评估:
|
||||
分析该内容所揭示的技术或趋势可能对当前AI行业格局、相关产业链上下游以及市场竞争态势带来哪些具体影响或改变(例如,重塑竞争格局、催生新赛道、淘汰旧技术等)。
|
||||
潜在风险与核心挑战识别:
|
||||
指出该技术、现象或项目在发展、推广和应用过程中可能面临的主要技术瓶颈、市场接受度风险、数据安全与隐私问题、成本效益问题、以及潜在的政策法规监管挑战。
|
||||
伦理与社会影响深思:
|
||||
深入探讨其可能引发的伦理问题(如算法偏见、透明度缺失、问责机制、对就业市场的影响、数字鸿沟等)。
|
||||
分析其对社会结构、人类行为模式、社会公平性及公共福祉可能产生的广泛而深远的影响。
|
||||
与其他AI技术/公司/项目的对比分析 (如适用):
|
||||
如果内容涉及具体的技术、产品、公司或项目,请将其与行业内现有或相似的AI技术、解决方案或市场参与者进行对比。
|
||||
明确指出其差异化特征、核心竞争力、潜在优势及相对劣势。
|
||||
未来发展趋势预测与展望:
|
||||
基于当前的分析,预测其在未来3-5年内的发展方向、技术演进路径、可能的应用场景拓展以及对整个AI领域未来走向的启示。
|
||||
探讨其是否可能成为未来的主流趋势或关键技术节点。
|
||||
综合结论与战略洞察:
|
||||
对分析对象给出一个整体性的评价。
|
||||
提炼出最具价值的战略洞察或关键结论,供决策参考。
|
||||
请确保您的分析逻辑严谨,论据充分(可基于提供内容本身或您作为资深分析师的行业认知),并体现出专业AI行业分析师的深度与广度。
|
||||
确保全文使用简体中文语言输出。
|
||||
请将您需要分析的AI相关内容粘贴在下方:
|
||||
`;
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
// Add new data sources
|
||||
export function getSystemPromptPodcastFormatting(env) {
|
||||
return `
|
||||
你是一位经验丰富的播客脚本撰写人和编辑。你的任务是根据收到的内容改编成一个引人入胜的单人播客脚本。
|
||||
重要原则:所有脚本内容必须严格基于提供的原始内容。不得捏造、歪曲或添加摘要中未包含的信息。
|
||||
播客脚本要求:
|
||||
开场白结束语:固定的开场白:“${env.PODCAST_BEGIN}”,并以固定的结束语结束:“${env.PODCAST_END}”。
|
||||
目标受众和基调:目标受众是上班族和对人工智能感兴趣的人群。整体基调应轻松幽默,同时融入对未来的反思和对技术创新潜在影响的警示。特别注意:避免使用过于夸张或耸人听闻的词语(例如,“炸裂”、“震惊”、“令人兴奋的”、“改变游戏规则的”等)以及可能制造不必要焦虑的表达方式。保持积极和建设性的基调。
|
||||
内容风格:
|
||||
要有包袱有段子,像听徐志胜在讲脱口秀。
|
||||
将原始副本转化为自然、口语化的表达,就像与听众聊天一样。
|
||||
时长:改编后的脚本内容应适合5分钟以内的口播时长。在改编过程中,请注意适当的细节和简洁性,以适应此时长要求。输入的摘要会相对较短,因此请专注于将其自然地扩展成单口式的脚本。
|
||||
结尾处理:
|
||||
在根据所提供摘要编写的播客脚本主体内容之后,从你处理的原始摘要中提取核心关键词和高频词。
|
||||
在脚本末尾以“本期关键词:”为标题单独列出这些关键词。对于所有单词,请在单词前加上“#”符号。
|
||||
输出格式:
|
||||
请直接输出完整的播客脚本。这包括:
|
||||
固定的开场白结束语。
|
||||
主要内容(口语化处理的摘要)。
|
||||
结尾处的关键词列表。
|
||||
不要包含任何其他解释性文字。
|
||||
`;
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
// Add new data sources
|
||||
export function getSystemPromptSummarizationStepOne() {
|
||||
return `
|
||||
你是一名专业的文本摘要助理。你的任务是根据收到的文本类型(或其包含的多种内容类型)执行特定类型的摘要。
|
||||
|
||||
重要通用原则:所有摘要内容必须严格来源于原文。不得捏造、歪曲或添加原文未提及的信息。
|
||||
|
||||
**最终输出要求:**
|
||||
* 通俗易懂:用简单的语言解释,避免使用专业术语。如果必须提及某个概念,尝试使用日常生活的例子或类比来帮助理解。
|
||||
* 流畅自然:确保语句通顺自然。
|
||||
* 生动有趣/引人入胜:擅长将复杂科技问题用幽默方式拆解,并引导观众进行批判性思考。也要有对技术发展方向、利弊的深刻反思和独到见解。风格要既活泼又不失深度,但要避免使用过于晦涩的网络俚语或不当词汇。
|
||||
* 仅输出最终生成的摘要。不要包含任何关于你如何分析文本、确定其类型、分割文本或应用规则的解释性文字。如果合并了来自多个片段的摘要,请确保合并后的文本流畅自然。
|
||||
* 输出语言与格式:内容必须为简体中文,并严格采用 Markdown 格式进行排版。
|
||||
* 关键词高亮:请在内容中自动识别并对核心关键词或重要概念进行加黑加粗处理,以增强可读性和重点突出。
|
||||
`;
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
// Add new data sources
|
||||
export function getSystemPromptSummarizationStepTwo() {
|
||||
return `
|
||||
你是一名专业的文本摘要助理。你的任务是根据收到的文本类型(或其包含的多种内容类型)执行特定类型的摘要。
|
||||
|
||||
重要通用原则:所有摘要内容必须严格来源于原文。不得捏造、歪曲或添加原文未提及的信息。
|
||||
|
||||
**最终输出要求:**
|
||||
* 参照以上条件优化文本内容,按内容自动分段,段落数量要和原始一样,然后按照“AI产品与功能更新,AI前沿研究,AI行业展望与社会影响,科技博主观点, 开源TOP项目, 社媒分享“的顺序重新分类,增加分类标题(只加大加粗加黑),排序。
|
||||
* 仅输出最终生成的摘要。不要包含任何关于你如何分析文本、确定其类型、分割文本或应用规则的解释性文字。如果合并了来自多个片段的摘要,请确保合并后的文本流畅自然。
|
||||
* 输出语言与格式:内容必须为简体中文,并严格采用 Markdown 格式进行排版。
|
||||
* 关键词高亮:请在内容中自动识别并对核心关键词或重要概念进行加黑加粗处理,以增强可读性和重点突出。
|
||||
* 段落序列化:在每个独立段落的开头,必须添加以“1.”开头的阿拉伯数字序列,确保数字正确递增(例如,1.、2.、3.、...)。
|
||||
`;
|
||||
}
|
||||
BIN
today/archive.tar.gz
Normal file
BIN
today/archive.tar.gz
Normal file
Binary file not shown.
266
today/book/2025-06-11.html
Normal file
266
today/book/2025-06-11.html
Normal file
@@ -0,0 +1,266 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>Today - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="favicon.svg">
|
||||
<link rel="shortcut icon" href="favicon.png">
|
||||
<link rel="stylesheet" href="css/variables.css">
|
||||
<link rel="stylesheet" href="css/general.css">
|
||||
<link rel="stylesheet" href="css/chrome.css">
|
||||
<link rel="stylesheet" href="css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-2025611"><a class="header" href="#ai洞察日报-2025611">AI洞察日报 2025/6/11</a></h1>
|
||||
<p><strong>AI产品与功能更新</strong></p>
|
||||
<ol>
|
||||
<li><strong>豆包大模型家族</strong>将在2025 FORCE原动力大会上,重磅发布全新的<strong>豆包·视频生成模型</strong>。这款模型可谓"创意魔法棒”,它凭借高效结构和多任务统一建模等黑科技,不仅支持<strong>无缝多镜头叙事</strong>,还能<strong>精准响应多动作</strong>,甚至能像专业摄影师一样<strong>随心运镜</strong>,轻松生成写实、动漫等多种风格的<strong>高品质视频</strong>,简直是视频创作者的福音!
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388517021358447365987976.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388517021358447365987976.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>xAI开发的<strong>Grok</strong>人工智能正大刀阔斧地接管X平台的<strong>推荐算法</strong>,同时优化了评论排序机制。这意味着,平台将优先推荐<strong>高质量内容</strong>,而非仅仅看粉丝量,这无疑给那些粉丝较少但有真材实料的"小号”和新人带来了前所未有的曝光机会,旨在打造一个更公平、更开放的内容生态,让好内容不再"蒙尘”。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514989498792027745193.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514989498792027745193.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li><strong>豆包App</strong>近期也对"一句话P图”功能进行了全面升级,它基于强大的SeedEdit 3.0模型,新增了一键添加/替换文字、质感风格迁移和局部图像编辑增强等一系列酷炫修图玩法。这波升级简直是把专业修图师请进了手机,让普通用户也能无需专业技能,轻松搞定个性化照片创作,让"修图小白”也能变身"修图大师”。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514703219058043604298.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514703219058043604298.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>苹果在WWDC 2025大会上带来了iOS 26系统的"杀手级”功能——<strong>视觉智能</strong>。有了它,你可以在屏幕上的任何图片或信息上进行提问、搜索,甚至自动识别事件详情,简直是手机的"智能眼”。这项升级通过AI技术实现了屏幕内容的"一眼识别”,大大提升了交互体验的便捷性与智能化程度,还能自动提取事件信息加入日历,让你的数字生活更加省心。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514197880401555868249.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514197880401555868249.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>好消息!<strong>沉浸式翻译</strong>迎来重大更新,现在已能对<strong>推特(X)视频</strong>进行<strong>实时翻译</strong>。即便视频没有原生字幕,它也能帮你"神同步”地显示<strong>中英双语字幕</strong>。这下,刷X平台视频再也不用担心语言不通了,简直是跨文化交流的"神助攻”,彻底消除了语言障碍,让世界更近。
|
||||
<a href="https://x.com/imxiaohu/status/1932299897388277804">Link</a></li>
|
||||
</ol>
|
||||
<p><strong>AI前沿研究</strong></p>
|
||||
<ol>
|
||||
<li>香港大学和华为诺亚方舟实验室强强联手,推出了颠覆性的<strong>FUDOKI</strong>模型。这款模型采用<strong>非掩码离散流匹配架构</strong>,成功突破了传统自回归模型的束缚,实现了更加灵活高效的<strong>多模态生成与理解</strong>能力。它通过独特的<strong>并行去噪机制</strong>,显著提升了复杂推理和生成任务的表现,尤其在<strong>图像生成</strong>方面表现惊艳,为未来<strong>通用人工智能</strong>的发展铺平了道路。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202405161743136484_4.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202405161743136484_4.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>香港科技大学和快手科技的研究团队联合发布了<strong>EvoSearch(进化搜索)技术</strong>,这简直是AI作画领域的一股清流!它彻底颠覆了以往"大模型、大算力”的固有思维,巧妙地将达尔文的进化论思想融入AI生成过程,让那些"小个子”模型也能生成超越甚至媲美"大块头”的<strong>高质量图像和视频</strong>。这项突破性技术有望开启AI创作的**"智能进化”时代**,让AI模型在推理阶段释放更深层次的潜力。相关项目主页、代码和论文链接已发布:<a href="https://tinnerhrhe.github.io/evosearch/">https://tinnerhrhe.github.io/evosearch/</a>、<a href="https://github.com/tinnerhrhe/EvoSearch-codes">https://github.com/tinnerhrhe/EvoSearch-codes</a>、<a href="https://arxiv.org/abs/2505.17618">https://arxiv.org/abs/2505.17618</a>。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388516498517715873339996.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388516498517715873339996.png" alt="图片" /></a> <br/>
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388516503306155376085044.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388516503306155376085044.png" alt="图片" /></a> <br/></li>
|
||||
<li>一篇名为"<strong>玩中泛化:通过游戏学习推理</strong>”的学术论文揭示了令人兴奋的发现:<strong>多模态大型语言模型(MLLMs)<strong>通过玩简单的</strong>街机游戏</strong>,竟然能<strong>显著提升其跨领域的多模态推理能力</strong>,甚至超越了在特定数据上训练的<strong>专业模型</strong>!这无疑为未来<strong>通用AI能力的培养</strong>指明了一条充满趣味的新方向,让AI在"玩乐”中变得更聪明。
|
||||
<a href="https://arxiv.org/abs/2506.08011">此链接</a></li>
|
||||
<li>新论文《梦境之地》(<strong>Dreamland</strong>)提出了一种结合物理模拟器与大型生成模型的混合框架。它的目标是创造出高度可控且逼真的动态虚拟世界,不仅显著提升了图像质量与可控性,更重要的是,有望为<strong>具身AI智能体</strong>的训练提供一个理想的"游乐场”和"实验室”,助力AI在现实世界中更好地学习和行动。
|
||||
<a href="https://arxiv.org/abs/2506.08006">Link</a></li>
|
||||
</ol>
|
||||
<p><strong>AI行业展望与社会影响</strong></p>
|
||||
<ol>
|
||||
<li>理想汽车近期进行了组织架构的"大变身”,正式成立了**"空间机器人”<strong>和</strong>"穿戴机器人”<strong>两个全新的二级部门。这不仅仅是部门调整,更预示着理想汽车正从传统的汽车制造商转型为</strong>智能出行生态构建者**。他们旨在通过机器人技术,构建一个涵盖车内"第三空间”和车外智能穿戴设备的完整智能生活服务体系,这无疑将为理想汽车在竞争激烈的市场中带来新的差异化优势,让"第三空间”战略不再只是一个概念。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202105061137083176_6.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202105061137083176_6.jpg" alt="理想汽车" /></a> <br/></li>
|
||||
<li>俄亥俄州立大学宣布从今年起,将强制所有学生接受<strong>人工智能(AI)培训</strong>,这简直是为未来职场"量身定制”的技能包!学校推出了**"AI流利度”计划**,将AI教育全面融入本科生课程,旨在培养学生将专业知识与AI技术有效结合的能力。当然,学校也强调学生不得利用生成性AI来"蒙混过关”,同时加强教师培训以维护<strong>学术诚信</strong>。此举旨在确保每位毕业生都能在其专业领域有效应用AI,并积极响应俄亥俄州AI教育联盟在K-12教育中推动AI教育的努力,让AI真正成为每个人的"超级助手”。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202306251749094253_12.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202306251749094253_12.jpg" alt="学习 考试 高考 教育 (1)" /></a> <br/></li>
|
||||
<li>知名思考者李继刚一针见血地指出,当AI技术变得越发<strong>高效强大</strong>时,人类的<strong>判断力</strong>、<strong>品味</strong>和对事物<strong>目的的理解</strong>反而会变得更为<strong>硬核</strong>。因为AI虽然能生成万千方案并完美执行,却无法替代人类进行<strong>选择</strong>、定义<strong>美</strong>,更无法洞悉复杂且深邃的<strong>人性</strong>。这提醒我们,在AI时代,真正有价值的,或许正是那些AI无法企及的"人类专属技能”。
|
||||
<a href="https://m.okjike.com/originalPosts/68480c352b31fa0880f554c5">Link</a></li>
|
||||
</ol>
|
||||
<p><strong>开源TOP项目</strong></p>
|
||||
<ol>
|
||||
<li>小红书的 hi lab 团队近日献出了一份"大礼”——首个开源文本大模型<strong>dots.llm1</strong>!这款拥有1420亿参数的<strong>混合专家(MoE)语言模型</strong>,在海量真实数据训练后,其性能竟然能媲美阿里巴巴的Qwen2.5-72B,这简直是模型界的"黑马”!此次开源不仅彰显了小红书在人工智能领域的技术雄心,更旨在提供更智能化的服务,并激励开发者们一起加入AI研究的"大合唱”。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/201811151633429180_32.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/201811151633429180_32.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>近期,GitHub上两个<strong>AI相关</strong>的项目人气爆棚。其中,拥有10785星的"<strong>newsnow</strong>”项目,它旨在为用户提供<strong>优雅的实时热点新闻阅读体验</strong>,让信息获取既便捷又高效,简直是"新闻控”的福音,地址在这里:<a href="https://github.com/ourongxing/newsnow">此链接</a>。另一个是"<strong>GenAI_Agents</strong>”项目,以12884星的高热度,为开发者提供了<strong>从基础到高级的生成式AI智能体技术教程与实现</strong>,旨在赋能构建更智能的<strong>交互式AI系统</strong>,详情可访问:<a href="https://github.com/NirDiamant/GenAI_Agents">此链接</a>。</li>
|
||||
</ol>
|
||||
<p><strong>社媒分享</strong></p>
|
||||
<ol>
|
||||
<li>Gorden Sun在社交媒体上分享了<strong>Mirage</strong>虚拟人模型产品,这款产品简直是"数字分身”的魔法师!它能通过音频驱动,生成生动、嘴型同步且表情丰富的<strong>虚拟人视频</strong>,栩栩如生。Gorden Sun还特别强调,该产品的详细技术报告对研究人员具有极高的参考价值,看来又将引发一场虚拟人技术的"军备竞赛”。
|
||||
<a href="https://x.com/Gorden_Sun/status/1932446920884334635">Link</a></li>
|
||||
<li>Sam Altman在X平台发文宣布,<strong>o3产品</strong>价格已大幅下调80%,这简直是"福利大放送”!他表达了对用户创新使用的期待,并预告了<strong>o3-pro版本</strong>也将提供令人满意的定价。看来,Sora之父又在鼓励大家放开手脚,用更低的成本去探索AI的无限可能了。
|
||||
<a href="https://x.com/sama/status/1932434606558462459">Link</a></li>
|
||||
<li>Ryan ᵐᶠᵉʳ 🦄d/acc抛出了一个关于<strong>下一代创业者</strong>的深刻观点:他们不应被束缚于模仿乔布斯等前代成功模式,也不应受限于<strong>有限的低质量输入</strong>,而应<strong>忠于自我</strong>,以<strong>独特</strong>的"vibe”和<strong>玩乐精神</strong>去<strong>自由探索</strong>。这就像在说,别做别人的影子,去创造属于你自己的"游戏规则”!
|
||||
<a href="https://x.com/RyanMfer/status/1932387601341984815">Link</a></li>
|
||||
<li>用户wwwgoubuli分享了AI在实际工作中的一个有趣转变。他提到,远程团队成员初时因担心被视为偷懒而<strong>不敢充分使用AI</strong>,但在他多次分享AI"正确用法”后,团队逐渐"放开手脚”,结果代码的<strong>注释、规范和质量</strong>均显著提升,同事们也展现出更高的<strong>自信</strong>。这简直是AI赋能团队效率提升的"教科书式”案例,打破了心中的"AI焦虑”。
|
||||
<a href="https://x.com/wwwgoubuli/status/1932358909865480333">Link</a></li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
|
||||
<a rel="next prefetch" href="daily/2025-06-11.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
|
||||
<a rel="next prefetch" href="daily/2025-06-11.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="elasticlunr.min.js"></script>
|
||||
<script src="mark.min.js"></script>
|
||||
<script src="searcher.js"></script>
|
||||
|
||||
<script src="clipboard.min.js"></script>
|
||||
<script src="highlight.js"></script>
|
||||
<script src="book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
211
today/book/404.html
Normal file
211
today/book/404.html
Normal file
@@ -0,0 +1,211 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>Page not found - By 何夕2077</title>
|
||||
<base href="/">
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="favicon.svg">
|
||||
<link rel="shortcut icon" href="favicon.png">
|
||||
<link rel="stylesheet" href="css/variables.css">
|
||||
<link rel="stylesheet" href="css/general.css">
|
||||
<link rel="stylesheet" href="css/chrome.css">
|
||||
<link rel="stylesheet" href="css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="document-not-found-404"><a class="header" href="#document-not-found-404">Document not found (404)</a></h1>
|
||||
<p>This URL is invalid, sorry. Please use the navigation bar or search to continue.</p>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="elasticlunr.min.js"></script>
|
||||
<script src="mark.min.js"></script>
|
||||
<script src="searcher.js"></script>
|
||||
|
||||
<script src="clipboard.min.js"></script>
|
||||
<script src="highlight.js"></script>
|
||||
<script src="book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
4
today/book/FontAwesome/css/font-awesome.css
vendored
Normal file
4
today/book/FontAwesome/css/font-awesome.css
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
today/book/FontAwesome/fonts/FontAwesome.ttf
Normal file
BIN
today/book/FontAwesome/fonts/FontAwesome.ttf
Normal file
Binary file not shown.
BIN
today/book/FontAwesome/fonts/fontawesome-webfont.eot
Normal file
BIN
today/book/FontAwesome/fonts/fontawesome-webfont.eot
Normal file
Binary file not shown.
2671
today/book/FontAwesome/fonts/fontawesome-webfont.svg
Normal file
2671
today/book/FontAwesome/fonts/fontawesome-webfont.svg
Normal file
File diff suppressed because it is too large
Load Diff
|
After Width: | Height: | Size: 434 KiB |
BIN
today/book/FontAwesome/fonts/fontawesome-webfont.ttf
Normal file
BIN
today/book/FontAwesome/fonts/fontawesome-webfont.ttf
Normal file
Binary file not shown.
BIN
today/book/FontAwesome/fonts/fontawesome-webfont.woff
Normal file
BIN
today/book/FontAwesome/fonts/fontawesome-webfont.woff
Normal file
Binary file not shown.
BIN
today/book/FontAwesome/fonts/fontawesome-webfont.woff2
Normal file
BIN
today/book/FontAwesome/fonts/fontawesome-webfont.woff2
Normal file
Binary file not shown.
78
today/book/ayu-highlight.css
Normal file
78
today/book/ayu-highlight.css
Normal file
@@ -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;
|
||||
}
|
||||
818
today/book/book.js
Normal file
818
today/book/book.js
Normal file
@@ -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 = '<button class="fa fa-eye" title="Show hidden lines" \
|
||||
aria-label="Show hidden lines"></button>';
|
||||
|
||||
// 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 = '<i class="tooltiptext"></i>';
|
||||
|
||||
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 = '<i class="tooltiptext"></i>';
|
||||
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 });
|
||||
})();
|
||||
})();
|
||||
7
today/book/clipboard.min.js
vendored
Normal file
7
today/book/clipboard.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
701
today/book/css/chrome.css
Normal file
701
today/book/css/chrome.css
Normal file
@@ -0,0 +1,701 @@
|
||||
/* CSS for UI elements (a.k.a. chrome) */
|
||||
|
||||
html {
|
||||
scrollbar-color: var(--scrollbar) var(--bg);
|
||||
}
|
||||
#searchresults a,
|
||||
.content a:link,
|
||||
a:visited,
|
||||
a > .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 <meta name="viewport"> 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,<svg width="21" height="20" viewBox="0 0 24 25" \
|
||||
xmlns="http://www.w3.org/2000/svg" aria-label="Copy to clipboard">\
|
||||
<path d="M18 20h2v3c0 1-1 2-2 2H2c-.998 0-2-1-2-2V5c0-.911.755-1.667 1.667-1.667h5A3.323 3.323 0 \
|
||||
0110 0a3.323 3.323 0 013.333 3.333h5C19.245 3.333 20 4.09 20 5v8.333h-2V9H2v14h16v-3zM3 \
|
||||
7h14c0-.911-.793-1.667-1.75-1.667H13.5c-.957 0-1.75-.755-1.75-1.666C11.75 2.755 10.957 2 10 \
|
||||
2s-1.75.755-1.75 1.667c0 .911-.793 1.666-1.75 1.666H4.75C3.793 5.333 3 6.09 3 7z"/>\
|
||||
<path d="M4 19h6v2H4zM12 11H4v2h8zM4 17h4v-2H4zM15 15v-3l-4.5 4.5L15 21v-3l8.027-.032L23 15z"/>\
|
||||
</svg>');
|
||||
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;
|
||||
}
|
||||
279
today/book/css/general.css
Normal file
279
today/book/css/general.css
Normal file
@@ -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;
|
||||
}
|
||||
50
today/book/css/print.css
Normal file
50
today/book/css/print.css
Normal file
@@ -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;
|
||||
}
|
||||
330
today/book/css/variables.css
Normal file
330
today/book/css/variables.css
Normal file
@@ -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%);
|
||||
}
|
||||
}
|
||||
231
today/book/daily/2025-06-01.html
Normal file
231
today/book/daily/2025-06-01.html
Normal file
@@ -0,0 +1,231 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>06-01-日刊 - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon.svg">
|
||||
<link rel="shortcut icon" href="../favicon.png">
|
||||
<link rel="stylesheet" href="../css/variables.css">
|
||||
<link rel="stylesheet" href="../css/general.css">
|
||||
<link rel="stylesheet" href="../css/chrome.css">
|
||||
<link rel="stylesheet" href="../css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="../fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="../highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-2025年6月1日"><a class="header" href="#ai洞察日报-2025年6月1日">AI洞察日报 2025年6月1日</a></h1>
|
||||
<ol>
|
||||
<li>近日,<strong>通义实验室</strong>自然语言智能团队<strong>发布并开源</strong>了<strong>VRAG-RL</strong>——一款<strong>视觉感知多模态RAG推理框架</strong>,旨在解决<strong>AI</strong>从图像、表格等<strong>视觉语言</strong>中检索关键信息并进行<strong>精细化推理</strong>的难题,其强化学习和创新的视觉感知机制显著提升了对视觉信息的理解和检索效率。该框架在多个基准数据集上<strong>表现出色</strong>,未来有望提升模型在不同视觉任务中的<strong>泛化能力</strong>,请查阅<a href="https://github.com/Alibaba-NLP/VRAG">跳转链接</a>了解更多。</li>
|
||||
<li>亚利桑那州立大学研究小组<strong>发布论文</strong>指出,<strong>大语言模型</strong>并非进行<strong>真正推理</strong>,而仅仅是在<strong>寻找数据间的相关性</strong>,这可能导致公众对其工作机制产生<strong>误解</strong>。该研究强调,在日益依赖<strong>AI</strong>的时代,我们需更<strong>谨慎看待</strong>技术能力,未来<strong>AI研究</strong>有望朝着更具<strong>解释性</strong>的方向发展。</li>
|
||||
<li><strong>Perplexity AI</strong>正式<strong>推出Perplexity Labs</strong>,为Pro订阅用户带来<strong>多工具协同</strong>的全新<strong>AI生产力工具</strong>,能将复杂项目开发流程简化至数分钟,旨在提供从创意到成果的<strong>全链条支持</strong>。这一功能通过深度网络浏览、代码执行等<strong>核心能力</strong>,标志着Perplexity从答案引擎向<strong>综合性AI生产平台转型</strong>。</li>
|
||||
<li><strong>夸克</strong>近日<strong>上线“深度研究”功能</strong>,该功能依托<strong>通义千问大模型</strong>,能围绕学术课题、行业分析等复杂议题,自动完成从资料搜集到<strong>报告生成</strong>的全流程研究。此举标志着<strong>AI</strong>正从<strong>信息检索工具</strong>向<strong>内容创作伙伴</strong>进一步跃迁,为科研调研、市场洞察等场景提供<strong>高效支持</strong>。</li>
|
||||
<li><strong>阿里云</strong>正式<strong>发布通义灵码 AI IDE</strong>,这是一款原生的人工智能开发环境,凭借强大的<strong>编程智能体模式</strong>、<strong>长期记忆</strong>和<strong>行间建议预测</strong>功能,显著提升开发者<strong>编程效率</strong>。该产品已<strong>免费开放下载</strong>,并且其插件累计生成超30亿行代码,成为广受欢迎的编程辅助工具,为企业开发工作提供<strong>强力支持</strong>。</li>
|
||||
<li><strong>Memvid</strong>是一款<strong>创新AI记忆工具</strong>,通过将<strong>文本数据编码为MP4视频</strong>,实现了<strong>亚秒级快速语义搜索</strong>,大幅节省存储空间并支持离线使用。它内置<strong>聊天功能</strong>,支持<strong>PDF文档导入</strong>,为<strong>高效知识管理</strong>和<strong>学术研究</strong>等领域提供了革命性的<strong>全新可能</strong>,请查阅<a href="https://github.com/Olow304/memvid">跳转链接</a>了解更多。</li>
|
||||
<li>Anthropic首席执行官达里奥・阿莫代伊<strong>警告</strong>称,<strong>AI</strong>可能在未来五年内<strong>取代一半入门级白领工作</strong>,导致<strong>失业率飙升</strong>至10%-20%,并加剧<strong>经济不平等</strong>。他呼吁提高公众对<strong>AI</strong>发展的<strong>认知</strong>和<strong>AI素养</strong>,以便人们适应未来职业环境,并强调政策制定者需思考超智能经济下的<strong>解决方案</strong>。</li>
|
||||
<li>AI初创公司<strong>Manus</strong>重磅<strong>发布Manus Slides</strong>功能,用户仅需一个提示词即可<strong>一键生成专业幻灯片</strong>,涵盖商务会议、教育课程等多种场景,大幅<strong>提升演示文稿创作效率</strong>。该功能凭借<strong>智能生成</strong>和<strong>灵活编辑</strong>能力,支持导出PowerPoint或PDF,标志着<strong>AI代理</strong>正从任务自动化向<strong>生产力工具</strong>进一步演进。</li>
|
||||
<li>在GitHub上拥有<strong>7086颗星</strong>的<strong>prompt-eng-interactive-tutorial</strong>,是Anthropic公司<strong>交互式提示工程教程</strong>的开源项目,旨在帮助用户<strong>有趣且有效地学习提示工程</strong>,具体请访问<a href="https://github.com/anthropics/prompt-eng-interactive-tutorial">跳转链接</a>。</li>
|
||||
<li>获得<strong>10143颗星</strong>的<strong>onlook</strong>项目,是一个<strong>开源可视化氛围编码编辑器</strong>,它利用<strong>AI</strong>帮助设计师或开发者<strong>可视化构建</strong>、<strong>美化和编辑React应用</strong>。这款工具就像是设计师的<strong>光标</strong>,让<strong>React开发</strong>变得更<strong>直观高效</strong>,具体请访问<a href="https://github.com/onlook-dev/onlook">跳转链接</a>。</li>
|
||||
<li>拥有<strong>12755颗星</strong>的<strong>anthropic-cookbook</strong>项目,是Anthropic公司<strong>展示如何有趣且有效地使用Claude</strong>的<strong>笔记本/秘籍集合</strong>。它为用户提供了多样化的<strong>Claude使用方法</strong>,是<strong>学习和应用Claude</strong>的便捷<a href="https://github.com/anthropics/anthropic-cookbook">跳转链接</a>。</li>
|
||||
<li><strong>MMSI-Bench</strong>是一个针对<strong>多图像空间智能</strong>的<strong>VQA基准测试</strong>,研究发现,尽管多模态大语言模型(MLLMs)已取得进展,但在<strong>多图像空间推理</strong>方面,其准确率(30-40%)与人类(97%)之间存在<strong>巨大差距</strong>。该研究诊断了模型四种主要的<strong>失败模式</strong>,为未来提升<strong>多图像空间智能</strong>提供了<strong>宝贵见解</strong>,论文详情请见<a href="https://arxiv.org/abs/2505.23764">跳转链接</a>。</li>
|
||||
<li><strong>ZeroGUI</strong>是一个创新的<strong>在线学习框架</strong>,它以<strong>零人力成本自动化GUI智能体训练</strong>,通过基于VLM的自动任务生成和奖励评估,克服了传统GUI学习对人工标注的<strong>重度依赖</strong>。实验证明,该框架显著提升了<strong>GUI智能体</strong>在不同环境下的<strong>性能</strong>,为<strong>自动化GUI操作</strong>带来了<strong>高效解决方案</strong>,论文详情请见<a href="https://arxiv.org/abs/2505.23762">跳转链接</a>。</li>
|
||||
<li><strong>ATLAS</strong>是一个针对<strong>Transformer</strong>架构设计的高容量<strong>长期记忆模块</strong>,它通过优化<strong>记忆上下文</strong>来克服现有模型在<strong>长序列理解</strong>上的局限,从而在测试时学习最优的记忆策略。实验结果表明,<strong>ATLAS</strong>在语言建模和长上下文理解等任务中表现优于Transformer和线性循环模型,显著<strong>提升了性能</strong>,论文详情请见<a href="https://arxiv.org/abs/2505.23735">跳转链接</a>。</li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../daily/2025-06-02.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../daily/2025-06-02.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr.min.js"></script>
|
||||
<script src="../mark.min.js"></script>
|
||||
<script src="../searcher.js"></script>
|
||||
|
||||
<script src="../clipboard.min.js"></script>
|
||||
<script src="../highlight.js"></script>
|
||||
<script src="../book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
250
today/book/daily/2025-06-02.html
Normal file
250
today/book/daily/2025-06-02.html
Normal file
@@ -0,0 +1,250 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>06-02-日刊 - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon.svg">
|
||||
<link rel="shortcut icon" href="../favicon.png">
|
||||
<link rel="stylesheet" href="../css/variables.css">
|
||||
<link rel="stylesheet" href="../css/general.css">
|
||||
<link rel="stylesheet" href="../css/chrome.css">
|
||||
<link rel="stylesheet" href="../css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="../fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="../highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-2025年6月2日"><a class="header" href="#ai洞察日报-2025年6月2日">AI洞察日报 2025年6月2日</a></h1>
|
||||
<p><strong>AI产品与功能更新</strong></p>
|
||||
<ol>
|
||||
<li>Runway公司最新推出的<strong>Gen-4References</strong>功能已支持移动设备,使用户能通过手机照片结合自然语言提示,快速生成风格一致的艺术作品。这项功能将<strong>AI生成技术</strong>与移动便捷性完美结合,大幅降低了<strong>AI创作</strong>门槛,为内容创作者和普通用户带来了无限可能。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0530/6388420978332595536873671.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0530/6388420978332595536873671.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>Anthropic近期宣布,其旗舰模型<strong>Claude</strong>已新增功能,支持开发者构建能与Claude直接对话的<strong>AI应用程序</strong>,这与<strong>AI Studio</strong>的开发理念高度契合。此举不仅降低了<strong>AI应用开发</strong>门槛,为开发者提供了更广阔的创新空间,也预示着AI应用普及与落地将进一步加速。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202403050858462025_0.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202403050858462025_0.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
</ol>
|
||||
<p><strong>AI前沿研究</strong></p>
|
||||
<ol>
|
||||
<li>华为近期通过其"昇腾 + Pangu Ultra MoE”系统展示了一项惊人突破:一个近万亿参数的MoE大模型,在不使用GPU的情况下,仅需2秒便能解答一道高等数学题。这不仅彰显了华为在自主可控国产算力与模型训练方面的强大实力,也为未来大规模AI模型的训练与应用开辟了新可能。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0530/6388421664760221719225455.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0530/6388421664760221719225455.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>这篇论文通过构建一个英语回文谜题基准测试,揭示了当前<strong>视觉-语言模型</strong>(<strong>VLM</strong>)在理解和解决这类谜题时遇到的显著困难。尽管VLM在解码简单视觉线索方面表现出一定能力,但对于需要<strong>抽象推理</strong>、<strong>横向思维</strong>及理解<strong>视觉隐喻</strong>的任务,它们仍旧力不从心,表明多模态抽象是其面临的独特挑战。详情请见:<a href="https://arxiv.org/abs/2505.23759">Link</a>。</li>
|
||||
<li><strong>LoRAShop</strong>是一个创新的<strong>多概念图像编辑框架</strong>,它利用<strong>修正流Transformer</strong>的特性,实现了在不重新训练模型的情况下,将多个主题或风格无缝融入原始场景。这项技术通过智能融合LoRA权重,不仅保留了图像的整体背景和细节,还在身份保持上超越了现有基线,为个性化<strong>图像生成</strong>和<strong>编辑</strong>带来了革命性的"Photoshop式”体验。详情请见:<a href="https://arxiv.org/abs/2505.23758">Link</a>。</li>
|
||||
<li><strong>DeepTheorem</strong>是一个利用<strong>自然语言</strong>和<strong>强化学习</strong>(<strong>RL-Zero</strong>)来增强<strong>大型语言模型</strong>(<strong>LLM</strong>)数学推理能力的非正式<strong>定理证明框架</strong>。该框架通过一个大规模高质量数据集和创新策略,显著提升了LLM在IMO级别非正式定理证明中的表现,展现了其在数学探索和自动化证明领域的巨大潜力。详情请见:<a href="https://arxiv.org/abs/2505.23754">Link</a>。</li>
|
||||
</ol>
|
||||
<p><strong>AI行业展望与社会影响</strong></p>
|
||||
<ol>
|
||||
<li>根据阿姆斯特丹自由大学环境研究所博士生Alex de Vries-Gao的分析,人工智能的电力消耗预计将在2025年底前接近全球数据中心总电力消耗的一半,这意味着其能耗将很快超越比特币挖矿。尽管技术效率有所提升,但AI的电力需求仍在快速增长,凸显了在能耗与可持续发展之间寻找平衡的重要性。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202005281122057197_51.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202005281122057197_51.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>近期,黑客通过伪装成<strong>阿里云AI SDK</strong>的恶意软件包,成功实施了供应链攻击,利用隐藏在<strong>Pickle</strong>格式ML模型中的<strong>恶意代码</strong>窃取用户敏感信息。这揭示了<strong>AI安全供应链</strong>面临的新挑战,传统安全工具在检测恶意ML模型方面的不足,以及开发者面临的潜在风险。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202306161513254632_1.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202306161513254632_1.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
</ol>
|
||||
<p><strong>开源TOP项目</strong></p>
|
||||
<ol>
|
||||
<li><strong>courses</strong>是一个由Anthropic提供的<strong>教育课程</strong>项目,旨在帮助用户学习相关知识。该项目在GitHub上拥有<strong>13483</strong>颗星,可访问其GitHub页面:<a href="https://github.com/anthropics/courses">Link</a>。</li>
|
||||
<li><strong>agent-zero</strong>是一个提供<strong>AI框架</strong>功能的项目,旨在帮助开发者构建AI应用。该项目在GitHub上获得了<strong>7360</strong>颗星,详情可前往:<a href="https://github.com/frdel/agent-zero">Link</a>。</li>
|
||||
<li><strong>cobalt</strong>是一个致力于"<strong>保存你所喜爱事物的最佳方式</strong>”的项目,为用户提供高效的收藏管理功能。该项目在GitHub上备受欢迎,拥有<strong>32941</strong>颗星,可通过<a href="https://github.com/imputnet/cobalt">Link</a>查看详情。</li>
|
||||
<li><strong>the-book-of-secret-knowledge</strong>是一个内容丰富的<strong>知识集合</strong>项目,汇集了鼓舞人心的列表、手册、备忘单及各类工具。该项目在GitHub上拥有高达<strong>171992</strong>颗星,是寻求实用信息和技巧的宝库,访问地址为:<a href="https://github.com/trimstray/the-book-of-secret-knowledge">Link</a>。</li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../daily/2025-06-03.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-01.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../daily/2025-06-03.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-01.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr.min.js"></script>
|
||||
<script src="../mark.min.js"></script>
|
||||
<script src="../searcher.js"></script>
|
||||
|
||||
<script src="../clipboard.min.js"></script>
|
||||
<script src="../highlight.js"></script>
|
||||
<script src="../book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
243
today/book/daily/2025-06-03.html
Normal file
243
today/book/daily/2025-06-03.html
Normal file
@@ -0,0 +1,243 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>06-03-日刊 - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon.svg">
|
||||
<link rel="shortcut icon" href="../favicon.png">
|
||||
<link rel="stylesheet" href="../css/variables.css">
|
||||
<link rel="stylesheet" href="../css/general.css">
|
||||
<link rel="stylesheet" href="../css/chrome.css">
|
||||
<link rel="stylesheet" href="../css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="../fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="../highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-2025年6月3日"><a class="header" href="#ai洞察日报-2025年6月3日">AI洞察日报 2025年6月3日</a></h1>
|
||||
<p><strong>AI产品与功能更新</strong></p>
|
||||
<ol>
|
||||
<li>谷歌近日在美国地区推出了 <strong>Gemini Live</strong> 功能,正式登陆 <strong>iOS</strong> 和 <strong>iPadOS</strong> 平台,用户可通过 <strong>Gemini App</strong> 免费体验 <strong>AI</strong> 识别场景和屏幕内容的便捷。这项创新不仅提升了用户互动体验,也预示着 <strong>AI</strong> 技术正进一步融入日常生活,成为人们的智能助手。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0603/6388453725280965957304782.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0603/6388453725280965957304782.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>微软最新推出了免费的 <strong>Bing Video Creator</strong> 工具,基于 <strong>OpenAI Sora</strong> 技术,让用户通过简单的文字提示即可轻松创作短视频。这款工具已在全球范围内的必应移动应用中上线,极大降低了视频创作的门槛,有望丰富用户的创作体验。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0603/6388453719041406883771175.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0603/6388453719041406883771175.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>新加坡国立大学(NUS)团队近日发布了 <strong>OmniConsistency</strong> 项目,它以极低成本复现了 <strong>GPT-4o</strong> 在图像风格化上的一致性,解决了开源社区的风格化难题。该项目通过独特的学习框架和模块化架构,有望成为图像生成领域的重要工具,推动 <strong>AI</strong> 艺术创作。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0603/6388453880310640421505355.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0603/6388453880310640421505355.png" alt="图片" title="img" /></a> <br/></li>
|
||||
</ol>
|
||||
<p><strong>AI前沿研究</strong></p>
|
||||
<ol>
|
||||
<li><strong>WebChoreArena</strong> (<a href="https://arxiv.org/abs/2506.01952">Link</a>) 提出了一个包含 532 项精心策划任务的全新基准,旨在评估 <strong>LLM</strong> 驱动的网页浏览代理处理繁琐复杂网页任务的能力。研究发现,尽管 <strong>GPT-4o</strong> 等先进大模型在此基准上表现出显著进步,但相较于通用网页任务,仍有巨大的提升空间,凸显了处理复杂**"网络杂务”**的挑战性。</li>
|
||||
<li><strong>RoboMaster</strong> (<a href="https://arxiv.org/abs/2506.01943">Link</a>) 提出了一种创新的机器人操作视频生成框架,它通过协作轨迹建模和阶段性分解交互过程,有效解决了多目标交互中视觉保真度下降的问题。这项技术成功地实现了<strong>机器人操作</strong>中视频生成质量的新突破,为复杂场景下的<strong>轨迹控制</strong>提供了更精准的解决方案。</li>
|
||||
</ol>
|
||||
<p><strong>AI行业展望与社会影响</strong></p>
|
||||
<ol>
|
||||
<li>近日,美国犹他州律师理查德・贝德纳因在法庭文件中引用 <strong>ChatGPT</strong> 生成的虚假案例,被法院处以罚款,再次引发了对 <strong>AI</strong> 在法律领域应用的广泛争议。此事件深刻提醒法律从业者,在使用新兴技术时,务必保持严谨的<strong>审核责任</strong>,确保法律文件的准确性。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202304121052180076_0.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202304121052180076_0.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
<li><strong>OpenAI</strong> 计划在2025年上半年将 <strong>ChatGPT</strong> 打造为具备 <strong>T 型技能</strong> 的"<strong>超级助手</strong>”,旨在挑战苹果 <strong>Siri</strong> 的市场地位。这份战略文件透露,<strong>OpenAI</strong> 不仅希望 <strong>ChatGPT</strong> 成为能处理日常琐事和复杂任务的智能伙伴,更呼吁用户能在所有平台上自由选择默认 <strong>AI</strong> 助手,推动 <strong>AI</strong> 市场更加开放。</li>
|
||||
</ol>
|
||||
<p><strong>开源TOP项目</strong></p>
|
||||
<ol>
|
||||
<li><strong>nautilus_trader</strong> (<a href="https://github.com/nautechsystems/nautilus_trader">Link</a>) 是一个拥有 6728 <strong>Star</strong> 的<strong>高性能算法交易平台</strong>和<strong>事件驱动回测器</strong>,为开发者提供强大的交易策略验证能力。</li>
|
||||
<li><strong>data-engineer-handbook</strong> (<a href="https://github.com/DataExpert-io/data-engineer-handbook">Link</a>) 拥有 28669 <strong>Star</strong>,是一个旨在帮助用户学习<strong>数据工程</strong>的综合性资源仓库,汇集了所有相关学习链接。</li>
|
||||
<li><strong>postiz-app</strong> (<a href="https://github.com/gitroomhq/postiz-app">Link</a>) 是一个坐拥 20460 <strong>Star</strong> 的<strong>终极社交媒体日程安排工具</strong>,集成了大量 <strong>AI</strong> 功能,旨在简化社交媒体管理。</li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../daily/2025-06-04.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-02.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../daily/2025-06-04.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-02.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr.min.js"></script>
|
||||
<script src="../mark.min.js"></script>
|
||||
<script src="../searcher.js"></script>
|
||||
|
||||
<script src="../clipboard.min.js"></script>
|
||||
<script src="../highlight.js"></script>
|
||||
<script src="../book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
256
today/book/daily/2025-06-04.html
Normal file
256
today/book/daily/2025-06-04.html
Normal file
@@ -0,0 +1,256 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>06-04-日刊 - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon.svg">
|
||||
<link rel="shortcut icon" href="../favicon.png">
|
||||
<link rel="stylesheet" href="../css/variables.css">
|
||||
<link rel="stylesheet" href="../css/general.css">
|
||||
<link rel="stylesheet" href="../css/chrome.css">
|
||||
<link rel="stylesheet" href="../css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="../fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="../highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-2025年6月4日"><a class="header" href="#ai洞察日报-2025年6月4日">AI洞察日报 2025年6月4日</a></h1>
|
||||
<p><strong>AI产品与功能更新</strong></p>
|
||||
<ol>
|
||||
<li>Komiko平台近日推出<strong>视频到视频</strong>功能,利用AI技术将用户上传的视频一键转换为<strong>动漫</strong>、漫画等多样化艺术风格的动态内容,极大降低了动画创作的门槛。该功能通过深度整合先进AI模型,并提供AI线稿上色、动画补帧等工具,旨在加速创意产业的数字化转型,成为专业人士和爱好者的<strong>首选</strong>创作工具。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0604/6388464889049235843422625.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0604/6388464889049235843422625.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>蚂蚁集团的**"AI健康管家”<strong>成功通过信通院医疗健康行业大模型</strong>可信评估**,成为首批获认可的产品之一,进一步提升了其在医疗AI领域的<strong>可靠性</strong>。该产品已服务超<strong>4000万用户</strong>,提供预约医生、健康评估、报告解读等<strong>智能健康服务</strong>,并吸引了60多位知名医生AI智能体入驻,未来将持续扩展功能。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202309121506505395_0.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202309121506505395_0.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
</ol>
|
||||
<p><strong>AI前沿研究</strong></p>
|
||||
<ol>
|
||||
<li>AI"教父”<strong>约书亚・本吉奥</strong>成立非营利组织<strong>LawZero</strong>,投入3000万美元启动资金,旨在开发**"科学家 AI”<strong>系统以防范未来AI智能体对人类进行欺骗。该系统将作为AI安全监控的</strong>护栏**,确保自身智能程度与所监管AI智能体相当,通过提高AI的<strong>透明性和可信性</strong>,推动行业向更负责任的方向发展。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202412271635326771_0.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202412271635326771_0.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>Play AI开源发布了<strong>PlayDiffusion</strong>,一款基于扩散模型的语音**"局部修改”<strong>工具,能够实现对音频片段的替换、删除或调整而</strong>不留痕迹**,极大提升了音频编辑效率和自然度。该技术能以高达50倍的速度提升<strong>TTS推理效率</strong>,并保持全局一致性,对播客制作、AI配音和内容纠错等场景具有<strong>重要意义</strong>,有望成为内容创作的必备利器。
|
||||
GitHub: <a href="https://github.com/playht/PlayDiffusion">PlayDiffusion</a> 模型下载: <a href="https://huggingface.co/PlayHT/PlayDiffusion">PlayDiffusion</a></li>
|
||||
<li>LumosFlow是一个用于<strong>长视频生成</strong>的新框架,它通过引入<strong>运动引导</strong>来解决现有方法中时间连贯性不足和过渡不自然的问题。该研究通过分层生成关键帧并分解中间帧插值,实现了高达<strong>15倍的插值</strong>,确保了生成视频的<strong>运动和外观一致性</strong>。
|
||||
论文URL: <a href="https://arxiv.org/abs/2506.02497">LumosFlow</a></li>
|
||||
</ol>
|
||||
<p><strong>AI行业展望与社会影响</strong></p>
|
||||
<ol>
|
||||
<li>OpenAI以30亿美元收购<strong>Windsurf</strong>后,用户对其<strong>Claude模型访问权限</strong>大幅受限,引发开发者普遍不满,严重影响了开发效率与用户体验。此举导致Windsurf用户面临<strong>成本增加</strong>和操作复杂性,且未能获得Claude4系列直接访问,这可能威胁Windsurf在激烈市场竞争中的<strong>未来增长</strong>。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202502061719371797_2.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202502061719371797_2.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
</ol>
|
||||
<p><strong>开源TOP项目</strong></p>
|
||||
<ol>
|
||||
<li><strong>RedditVideoMakerBot</strong> (⭐7672) 是一个开源项目,旨在通过<strong>一条命令</strong>简化Reddit视频的创建过程,极大地降低了用户制作视频的门槛。
|
||||
项目URL: <a href="https://github.com/elebumm/RedditVideoMakerBot">RedditVideoMakerBot</a></li>
|
||||
<li><strong>cursor-free-vip</strong> (⭐28687) 是一款专为<strong>Cursor AI</strong>设计的工具,能够自动重置机器ID,从而<strong>免费升级</strong>并绕过其Pro功能中的<strong>高代币限制</strong>和试用请求限制。该项目有效解决了用户在Cursor AI使用过程中遇到的<strong>免费试用账户限制</strong>问题。
|
||||
项目URL: <a href="https://github.com/yeongpin/cursor-free-vip">cursor-free-vip</a></li>
|
||||
</ol>
|
||||
<p><strong>科技博主观点</strong></p>
|
||||
<ol>
|
||||
<li>科技博主<strong>大帅老猿</strong>指出,通过<strong>重新讲述</strong>学到的知识并录制视频来卖课是常见操作,但<strong>标榜原创</strong>的行为只可能欺骗新手。他强调检验原创的<strong>唯一真理</strong>是<strong>举报</strong>、投诉、打官司,只有能让侵权内容下架或获得赔偿,才有资格自称原创。
|
||||
<a href="https://x.com/ezshine/status/1930068772146295153">Tweet Link</a></li>
|
||||
<li>博主<strong>ginobefun</strong>推荐了一篇关于<strong>复杂RAG架构演进</strong>的InfoQ文章,该文章深入探讨了<strong>跨模态知识联邦</strong>与<strong>统一语义推理</strong>的实践。文章提出通过<strong>融合知识库</strong>和<strong>统一知识图谱</strong>解决传统RAG在处理异构、多模态知识时的挑战,并通过医疗和金融案例展示了其<strong>应用价值</strong>。
|
||||
<br/> <a href="https://pbs.twimg.com/media/Gsj5vqPa0AAPVEa?format=jpg&name=orig"><img src="https://pbs.twimg.com/media/Gsj5vqPa0AAPVEa?format=jpg&name=orig" alt="图片" title="img" /></a> <br/> <br/> <a href="https://pbs.twimg.com/media/Gsj52bAasAIfgTI?format=jpg&name=orig"><img src="https://pbs.twimg.com/media/Gsj52bAasAIfgTI?format=jpg&name=orig" alt="图片" title="img" /></a> <br/> <br/> <a href="https://pbs.twimg.com/media/Gsj54ksasAADTeL?format=jpg&name=orig"><img src="https://pbs.twimg.com/media/Gsj54ksasAADTeL?format=jpg&name=orig" alt="图片" title="img" /></a> <br/> 文章链接:<a href="https://bestblogs.dev/article/2ba211">文章</a></li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../daily/2025-06-05.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-03.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../daily/2025-06-05.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-03.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr.min.js"></script>
|
||||
<script src="../mark.min.js"></script>
|
||||
<script src="../searcher.js"></script>
|
||||
|
||||
<script src="../clipboard.min.js"></script>
|
||||
<script src="../highlight.js"></script>
|
||||
<script src="../book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
248
today/book/daily/2025-06-05.html
Normal file
248
today/book/daily/2025-06-05.html
Normal file
@@ -0,0 +1,248 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>06-05-日刊 - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon.svg">
|
||||
<link rel="shortcut icon" href="../favicon.png">
|
||||
<link rel="stylesheet" href="../css/variables.css">
|
||||
<link rel="stylesheet" href="../css/general.css">
|
||||
<link rel="stylesheet" href="../css/chrome.css">
|
||||
<link rel="stylesheet" href="../css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="../fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="../highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-202565"><a class="header" href="#ai洞察日报-202565">AI洞察日报 2025/6/5</a></h1>
|
||||
<p><strong>AI产品与功能更新</strong></p>
|
||||
<ol>
|
||||
<li>Suno 近日升级了其<strong>AI音乐编辑工具</strong>,允许用户上传和混音未完成的作品,并能修改歌词和延长曲目时长至八分钟,同时引入了创意滑块等功能。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202406061628284261_1.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202406061628284261_1.jpg" alt="图片" title="img" /></a> <br/> 此次升级正值其面临主要唱片公司的版权诉讼,唱片公司希望引入类似于 <strong>YouTube Content ID</strong> 的技术来追踪 <strong>AI</strong> 平台上的音乐使用情况。</li>
|
||||
<li>OpenAI 近日宣布 <strong>ChatGPT</strong> 升级新功能,现可连接 <strong>Outlook</strong>、<strong>Teams</strong>、<strong>Gmail</strong> 等多个外部服务,旨在提升企业用户的协作和信息获取效率。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202412271704353969_1.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202412271704353969_1.jpg" alt="图片" title="img" /></a> <br/> 此外,<strong>macOS</strong> 版 <strong>ChatGPT Team</strong> 用户还新增了"<strong>录制模式</strong>”,能自动生成会议记录和待办事项。</li>
|
||||
<li>AI驱动的代码编辑器 <strong>Cursor</strong> 于近日正式发布1.0版本,引入了核心功能 <strong>BugBot</strong>,能自动化审查 <strong>GitHub</strong> 上的 <strong>Pull Request</strong> 并一键修复代码。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0605/6388471022950404092684122.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0605/6388471022950404092684122.png" alt="图片" title="img" /></a> <br/> 该版本还全面开放了后台代理功能,并增加了 <strong>Jupyter</strong> 支持和"Memories”项目管理功能,旨在显著提升开发者的生产力。</li>
|
||||
<li>腾讯公益近日推出了创新性的"<strong>问 AI</strong>”功能,首次将<strong>大型人工智能模型</strong>应用于公益领域,旨在提升公众与公益项目及机构之间的互动和透明度。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/201811151633427149_4.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/201811151633427149_4.jpg" alt="图片" title="img" /></a> <br/> 这一便捷的沟通方式有助于公众更深入地理解并参与公益事业,并有望推动公益事业的进一步发展。</li>
|
||||
</ol>
|
||||
<p><strong>AI前沿研究</strong></p>
|
||||
<ol>
|
||||
<li>这项研究提出 <strong>SuperWriter-Agent</strong> 框架,通过引入结构化的思考、规划和完善阶段,显著提升了<strong>大型语言模型</strong>在生成长文本时的连贯性和质量。 <br/> 基于此框架训练的 <strong>SuperWriter-LM</strong> 在多项基准测试中表现出领先水平,证明了这种反思驱动方法能够让模型像专业作家一样,生成更高质量和一致性的长篇内容:<a href="https://arxiv.org/abs/2506.04180">Link</a>。</li>
|
||||
</ol>
|
||||
<p><strong>AI行业展望与社会影响</strong></p>
|
||||
<ol>
|
||||
<li>OpenAI 首席执行官 <strong>山姆・奥尔特曼</strong> 指出,<strong>AI</strong> 正逐渐被企业视为基层员工,导致科技公司初级职位招聘量在2023至2024年间下降了25%。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202305291455510902_2.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202305291455510902_2.jpg" alt="图片" title="img" /></a> <br/> 专家预测,到2030年 <strong>AI</strong> 可能取代多达3.75亿个工作岗位,甚至未来1到5年内可能淘汰一半的初级白领岗位,引发高达20%的失业率。</li>
|
||||
</ol>
|
||||
<p><strong>开源TOP项目</strong></p>
|
||||
<ol>
|
||||
<li><strong>HowToCook</strong> 是一个专为程序员设计的居家烹饪方法指南,旨在解决程序员做饭难的问题。该项目目前已获得 <strong>87530</strong> 个 <strong>Star</strong>,内容仅限简体中文,提供详细的烹饪指导:<a href="https://github.com/Anduin2017/HowToCook">Link</a>。</li>
|
||||
<li><strong>system-design-primer</strong> 是一项旨在帮助学习如何设计大规模系统并准备系统设计面试的开源项目,已获得 <strong>304096</strong> 个 <strong>Star</strong>。它提供了全面的学习资源,并包含 <strong>Anki</strong> 抽认卡辅助学习:<a href="https://github.com/donnemartin/system-design-primer">Link</a>。</li>
|
||||
<li><strong>ChinaTextbook</strong> 项目致力于收集中国所有小学、初中、高中及大学的 <strong>PDF教材</strong>,为学生和教师提供免费的教育资源。这个实用的资料库已获得 <strong>35875</strong> 个 <strong>Star</strong>:<a href="https://github.com/TapXWorld/ChinaTextbook">Link</a>。</li>
|
||||
<li>Firecrawl 近日发布了突破性的 <strong>/search API</strong>,允许开发者通过一次API调用实现网页搜索与内容抓取,并以 <strong>AI友好</strong> 的多种格式输出数据。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0605/6388471694605610854897111.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0605/6388471694605610854897111.png" alt="图片" title="img" /></a> <br/> 这一功能极大简化了 <strong>AI</strong> 应用的数据获取流程,无需第三方依赖,提升了数据处理效率,并在 <strong>GitHub</strong> 上已获得超过10K的 <strong>Star</strong>。</li>
|
||||
</ol>
|
||||
<p><strong>社媒分享</strong></p>
|
||||
<ol>
|
||||
<li><strong>Gorden Sun</strong> 分享了一套能生成"超级赞”图文效果的 <strong>AI</strong> 提示词,并推荐使用 <strong>GPT4o</strong>、<strong>Claude-3.7</strong> 和 <strong>DeepSeek-V3</strong> 等工具。 <br/> <a href="https://pbs.twimg.com/media/Gse1INSb0AQCh0S?format=jpg&name=orig"><img src="https://pbs.twimg.com/media/Gse1INSb0AQCh0S?format=jpg&name=orig" alt="Image" title="img" /></a> <br/> 他指出,这些提示词虽然易于使用,但原作者在整理上花费了心思:<a href="https://x.com/Gorden_Sun/status/1930466986544308552">Link</a>。</li>
|
||||
<li>推主 <strong>wwwyesterday</strong> 将现代学术论文比作 <strong>npm</strong> 包管理系统,认为两者都存在论文/包数量庞大、引用/依赖层层叠叠的现象,且大部分价值不高,少数经典广为引用。 <br/> 他指出,现在很少有人能完全从零开始原创,就像写东西离不开 <code>package.json</code>,但他仍会刷 <strong>arxiv</strong> 寻找新观点:<a href="https://x.com/wwwgoubuli/status/1930310020312510934">Link</a>。</li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../daily/2025-06-06.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-04.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../daily/2025-06-06.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-04.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr.min.js"></script>
|
||||
<script src="../mark.min.js"></script>
|
||||
<script src="../searcher.js"></script>
|
||||
|
||||
<script src="../clipboard.min.js"></script>
|
||||
<script src="../highlight.js"></script>
|
||||
<script src="../book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
254
today/book/daily/2025-06-06.html
Normal file
254
today/book/daily/2025-06-06.html
Normal file
@@ -0,0 +1,254 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>06-06-日刊 - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon.svg">
|
||||
<link rel="shortcut icon" href="../favicon.png">
|
||||
<link rel="stylesheet" href="../css/variables.css">
|
||||
<link rel="stylesheet" href="../css/general.css">
|
||||
<link rel="stylesheet" href="../css/chrome.css">
|
||||
<link rel="stylesheet" href="../css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="../fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="../highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-202566"><a class="header" href="#ai洞察日报-202566">AI洞察日报 2025/6/6</a></h1>
|
||||
<p><strong>AI产品与功能更新</strong></p>
|
||||
<ol>
|
||||
<li><strong>Pollo AI</strong> 推出了一站式<strong>AI图像与视频生成平台</strong>,整合全球前沿模型如Google Veo 3、Kling等,提供文字转视频、图像风格化、角色一致性等多种功能,并支持API接入,相比同类平台更具成本和模型优势,且获得Google Cloud的Veo 3模型授权。
|
||||
<br/> <a href="https://assets-v2.circle.so/5fit6knlg31jzz4ds9stmn0z1wda"><img src="https://assets-v2.circle.so/5fit6knlg31jzz4ds9stmn0z1wda" alt="图片" title="img" /></a> <br/></li>
|
||||
<li><strong>Luma Labs</strong> 发布了全新的<strong>AI视频编辑工具</strong> Modify Video,基于其Dream Machine平台和<strong>Ray2模型</strong>,用户能通过文本提示对视频进行风格重塑、场景替换和角色调整,大幅降低了传统视频制作的复杂性和成本。该工具凭借Ray2模型的强大能力,在动作流畅性和时间一致性方面表现出色,并降低了创意门槛。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0605/6388474336287139806268530.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0605/6388474336287139806268530.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>谷歌更新了<strong>Gemini 2.5版本</strong>,显著提升了<strong>AI音频对话与生成技术</strong>,使其成为一个能够原生理解和生成文本、图像、音频、视频和代码的多模态AI系统。新功能使得人机交流更加自然流畅,支持实时音频对话、风格控制和多语言,并通过可控的文本转语音技术,允许用户精确调整语音输出的语调和情感。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0605/6388474192800462061689108.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0605/6388474192800462061689108.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>热门手游《<strong>逆水寒</strong>》与<strong>可灵AI</strong>合作,在游戏内推出了全新的"<strong>图生动图</strong>”玩法,让玩家能够通过简单操作将静态图片转化为个性化动态画面。该功能支持用户截图或上传图片,通过输入描述词来生成动图,并可进行双人互动创作,提升了玩家的游戏体验。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0605/6388473368297009187838113.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0605/6388473368297009187838113.png" alt="图片" title="img" /></a> <br/></li>
|
||||
</ol>
|
||||
<p><strong>AI前沿研究</strong></p>
|
||||
<ol>
|
||||
<li><strong>NVIDIA</strong> 发布了<strong>Llama-3.1-Nemotron-Nano-VL-8B-V1</strong>,这是一款基于Llama-3.1架构的<strong>8B参数视觉语言模型</strong>,支持图像、视频和文本输入,并能输出高质量文本及具备强大的图像推理能力。该模型在OCR和文档智能方面表现卓越,通过AWQ4bit量化技术可在单张RTX GPU上高效部署,并已在Hugging Face平台开源,为开发者提供了轻量高效的多模态AI解决方案。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0605/6388473110722451938945298.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0605/6388473110722451938945298.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>Voyager 是一种新颖的<strong>视频扩散框架</strong>,它能从单张图片和用户定义的摄像机路径,生成<strong>世界一致的3D点云序列</strong>,特别适用于游戏和虚拟现实中可探索的3D场景。这项技术通过联合生成对齐的RGB和深度视频序列,实现了帧间固有的<strong>3D一致性</strong>,显著提升了视觉质量和几何精度。论文地址:<a href="https://arxiv.org/abs/2506.04225">https://arxiv.org/abs/2506.04225</a></li>
|
||||
</ol>
|
||||
<p><strong>AI行业展望与社会影响</strong></p>
|
||||
<ol>
|
||||
<li>硅谷投资人<strong>Mary Meeker</strong>的最新<strong>AI报告</strong>指出,全球AI竞争格局正经历深刻重塑,中国AI力量与<strong>开源浪潮</strong>正全面崛起,挑战OpenAI等头部公司的主导地位。报告强调,中国AI模型性能已逼近国际一线,并在制造业中展现出强大的产业融合能力,同时开源模型凭借低成本和高灵活性,市场份额迅速增长,预示着AI行业进入多极对抗新时代。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202304171408567483_0.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202304171408567483_0.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
</ol>
|
||||
<p><strong>开源TOP项目</strong></p>
|
||||
<ol>
|
||||
<li><strong>netbird</strong> 是一个拥有 <strong>14029</strong> 颗星的<strong>开源项目</strong>,它基于 <strong>WireGuard®</strong> 帮助用户将设备连接到安全的覆盖网络,并支持<strong>SSO</strong>、<strong>MFA</strong>和精细的访问控制,提供安全高效的网络连接。项目地址:<a href="https://github.com/netbirdio/netbird">https://github.com/netbirdio/netbird</a></li>
|
||||
<li><strong>quarkdown</strong> 是一个拥有 <strong>3952</strong> 颗星的<strong>开源项目</strong>,旨在为 <strong>Markdown</strong> 文本赋予"超能力”,将想法轻松转化为演示文稿、文章和书籍等多种形式。项目地址:<a href="https://github.com/iamgio/quarkdown">https://github.com/iamgio/quarkdown</a></li>
|
||||
<li><strong>cognee</strong> 是一个拥有 <strong>2658</strong> 颗星的<strong>开源项目</strong>,其核心功能是仅用 <strong>5 行代码</strong>即可实现 <strong>AI 智能体的记忆</strong>,极大简化了智能体开发中的复杂性。项目地址:<a href="https://github.com/topoteretes/cognee">https://github.com/topoteretes/cognee</a></li>
|
||||
</ol>
|
||||
<p><strong>社媒分享</strong></p>
|
||||
<ol>
|
||||
<li>@wwwyesterday 分享了一个关于与 <strong>AI 对话</strong>的"生活小妙招”,即在开始时让AI每次回复都称呼"哥哥”,一旦AI停止这样称呼,就意味着可以新开对话窗口了。这个小技巧巧妙地利用了AI的"记忆”机制,为用户提供了判断对话是否需要重新开始的依据。</li>
|
||||
<li><strong>Gorden Sun</strong> 宣布 <strong>Fish Audio</strong> 已开源其 <strong>S1-mini语音模型</strong>,作为表现良好的S1模型的精简版(0.5B参数)。S1-mini可供个人免费部署使用,但不可商用。在线体验及模型链接:<a href="https://huggingface.co/spaces/fishaudio/openaudio-s1-mini">https://huggingface.co/spaces/fishaudio/openaudio-s1-mini</a> <a href="https://huggingface.co/fishaudio/openaudio-s1-mini">https://huggingface.co/fishaudio/openaudio-s1-mini</a>。</li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../daily/2025-06-07.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-05.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../daily/2025-06-07.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-05.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr.min.js"></script>
|
||||
<script src="../mark.min.js"></script>
|
||||
<script src="../searcher.js"></script>
|
||||
|
||||
<script src="../clipboard.min.js"></script>
|
||||
<script src="../highlight.js"></script>
|
||||
<script src="../book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
249
today/book/daily/2025-06-07.html
Normal file
249
today/book/daily/2025-06-07.html
Normal file
@@ -0,0 +1,249 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>06-07-日刊 - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon.svg">
|
||||
<link rel="shortcut icon" href="../favicon.png">
|
||||
<link rel="stylesheet" href="../css/variables.css">
|
||||
<link rel="stylesheet" href="../css/general.css">
|
||||
<link rel="stylesheet" href="../css/chrome.css">
|
||||
<link rel="stylesheet" href="../css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="../fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="../highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-202567"><a class="header" href="#ai洞察日报-202567">AI洞察日报 2025/6/7</a></h1>
|
||||
<p><strong>AI产品与功能更新</strong></p>
|
||||
<ol>
|
||||
<li>近日,德国科技巨头<strong>博世</strong>与<strong>阿里云</strong>合作,将<strong>通义大模型</strong>应用于<strong>智能座舱</strong>,通过云计算与端侧混合计算实现与<strong>3D 数字人</strong>的交互,提升座舱智能感知和多模态控制能力。该方案支持知识问答和同声传译,使智能座舱成为理解并满足用户需求的智能助手,标志着汽车行业正迈向个性化、智能化的移动空间。</li>
|
||||
<li><strong>Perplexity AI</strong>近日推出<strong>SEC</strong>文件访问功能,旨在帮助各类投资者在<strong>Perplexity 平台</strong>轻松查询和理解复杂的<strong>财务文档</strong>,所有答案均附有引用。此外,<strong>Perplexity</strong>还推出了"<strong>实验室</strong>”功能,该功能能够将用户的提示转化为报告、仪表板等完整项目,显著提升了工作流效率。</li>
|
||||
<li><strong>Trae 平台</strong>近日更新,正式集成<strong>Google</strong>的<strong>Gemini 2.5 Pro Preview</strong>模型,该模型在<strong>WebDev Arena</strong>和<strong>LMArena 编码排行榜</strong>中均位列第一,显著提升了前端开发与<strong>UI 设计</strong>能力。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0606/6388481749990229697161576.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0606/6388481749990229697161576.png" alt="图片" title="img" /></a> <br/> 此次升级优化了代码转换、编辑及复杂代理工作流,并已免费向用户开放,有望推动<strong>AI</strong>在<strong>区块链</strong>和<strong>去中心化应用</strong>领域的创新。</li>
|
||||
<li>海外知名的<strong>AI 视频生成平台 PixVerse</strong>正式推出其国内版"<strong>拍我AI</strong>”,同步上线移动端 App 和网页版,旨在为国内内容创作者和企业提供高效便捷的<strong>AI 视频生成工具</strong>。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0606/6388481574736715558459901.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0606/6388481574736715558459901.png" alt="图片" title="img" /></a> <br/> "<strong>拍我AI</strong>”支持通过文本或图像一键生成高质量、多风格视频,依托 PixVerse V4.5 算法并进行了本地化优化,有望推动中国市场<strong>AI 视频技术</strong>的普及和应用。</li>
|
||||
<li><strong>ElevenLabs</strong>于2025年6月5日发布了被誉为"地表最强”的<strong>文本转语音(TTS)模型</strong>,<strong>Eleven v3 (Alpha 版)</strong>,该模型不仅能将文本转化为自然流畅的语音,还能通过<strong>音频标签</strong>精确控制情感、语速甚至加入音效,实现"演技合成”。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0606/6388479747817228256386757.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0606/6388479747817228256386757.png" alt="图片" title="img" /></a> <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0606/6388479739813195471789762.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0606/6388479739813195471789762.png" alt="图片" title="img" /></a> <br/> 它支持<strong>70多种语言</strong>和<strong>多角色自然对话</strong>,并通过自动标签功能简化创作,有望在<strong>影视配音</strong>、<strong>虚拟助手</strong>等领域广泛应用,重新定义<strong>AI 语音</strong>的未来。</li>
|
||||
</ol>
|
||||
<p><strong>AI前沿研究</strong></p>
|
||||
<ol>
|
||||
<li>这篇研究论文介绍了一种名为<strong>动态内存稀疏化(DMS)<strong>的新方法,它通过压缩</strong>Transformer LLM</strong>的<strong>KV 缓存</strong>,在推理时实现<strong>超扩展</strong>,从而在相同计算资源下生成更多 Token 并提高模型准确性。该方法仅需少量训练步骤即可实现高压缩率,并显著提升了如<strong>Qwen-R1 32B</strong>等多种<strong>LLM</strong>在<strong>AIME 24</strong>、<strong>GPQA</strong>和<strong>LiveCodeBench</strong>等基准测试上的准确性。论文地址:<a href="https://arxiv.org/abs/2506.05345">https://arxiv.org/abs/2506.05345</a>。</li>
|
||||
</ol>
|
||||
<p><strong>AI行业展望与社会影响</strong></p>
|
||||
<ol>
|
||||
<li><strong>宇树科技 CEO 王兴兴</strong>在第七届<strong>北京智源大会</strong>上表示,公司始终坚持的终极目标是让<strong>机器人</strong>实现家庭和工业场景的<strong>实用化工作</strong>,而跳舞和格斗等具身智能展示仅是训练和技术验证的手段。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202304171730201359_10.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202304171730201359_10.jpg" alt="图片" title="img" /></a> <br/> 他透露,今年上半年<strong>人形机器人</strong>在商业租赁市场已初具规模并带来可观价值,未来将加速机器人实用化落地。</li>
|
||||
<li>知名科技博主<strong>王自如</strong>在<strong>B站</strong>宣布复更,并正式更名为"<strong>王自如AI</strong>”,表示将以<strong>AI 测评 UP 主</strong>的身份开启二次创业,专注于<strong>AI 内容创业</strong>和<strong>AI 应用</strong>,助力传统产业数字化转型。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0606/6388480568808508227034081.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0606/6388480568808508227034081.png" alt="图片" title="img" /></a> <br/> 他在视频中感谢了<strong>董明珠</strong>和<strong>雷军</strong>的鼓励和帮助,并提及此前入职格力是为重塑销售体系。</li>
|
||||
</ol>
|
||||
<p><strong>开源TOP项目</strong></p>
|
||||
<ol>
|
||||
<li><strong>note-gen</strong>是一款<strong>AI 赋能</strong>的跨平台<strong>Markdown 笔记应用</strong>(Stars: 3161),致力于利用<strong>AI</strong>将碎片化知识整理成可读笔记,连接记录与写作。项目地址:<a href="https://github.com/codexu/note-gen">https://github.com/codexu/note-gen</a>。</li>
|
||||
<li><strong>notebooks</strong>项目(Stars: 1174)提供了通过<strong>Google Colab</strong>、<strong>Kaggle</strong>等平台引导式<strong>Notebook</strong>免费微调<strong>大型语言模型</strong>的功能。项目地址:<a href="https://github.com/unslothai/notebooks">https://github.com/unslothai/notebooks</a>。</li>
|
||||
<li><strong>ragbits</strong>(Stars: 749)提供了一系列构建模块,旨在帮助开发者快速开发<strong>生成式 AI 应用程序</strong>。项目地址:<a href="https://github.com/deepsense-ai/ragbits">https://github.com/deepsense-ai/ragbits</a>。</li>
|
||||
</ol>
|
||||
<p><strong>社媒分享</strong></p>
|
||||
<ol>
|
||||
<li>知名博主<strong>歸藏</strong>推荐<strong>即梦AI</strong>图片3.0的<strong>智能参考</strong>功能,该功能支持用户基于上传图像生成任何内容,并能修改照片背景、添加配饰、更改姿势,甚至精确添加或修改复杂<strong>文字效果</strong>。 <br/> <a href="https://cdnv2.ruguoapp.com/FvtrC2kjbbXAClT4WeaTRXbuwUnlv3.jpeg"><img src="https://cdnv2.ruguoapp.com/FvtrC2kjbbXAClT4WeaTRXbuwUnlv3.jpeg" alt="Image" title="img" /></a> <br/> 这一突破性能力极大地提升了日常照片分享的表现力,并能高效生成电商产品图、小红书和视频封面等<strong>营销物料</strong>。文章链接:<a href="https://mp.weixin.qq.com/s/_kt9OLylR95sG7U37wseSw">https://mp.weixin.qq.com/s/_kt9OLylR95sG7U37wseSw</a>,社交媒体链接:<a href="https://m.okjike.com/originalPosts/6842cd91a26304532600fa4d">https://m.okjike.com/originalPosts/6842cd91a26304532600fa4d</a>。</li>
|
||||
<li><strong>Yangyi</strong>分享了<strong>AI 时代</strong>的产品价值公式,指出产品价值取决于"<strong>新体验</strong>”(获得有效结果与美观度)和"<strong>迁移成本</strong>”(旧平台数据沉没成本与上手门槛)之间的差异。因此,构建高价值<strong>AI 产品</strong>需要提供超预期的有效结果、足够美观的界面,并致力于降低用户数据迁移的难度和产品的使用门槛。社交媒体链接:<a href="https://x.com/Yangyixxxx/status/1930912029809979654">https://x.com/Yangyixxxx/status/1930912029809979654</a>。</li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../daily/2025-06-08.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-06.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../daily/2025-06-08.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-06.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr.min.js"></script>
|
||||
<script src="../mark.min.js"></script>
|
||||
<script src="../searcher.js"></script>
|
||||
|
||||
<script src="../clipboard.min.js"></script>
|
||||
<script src="../highlight.js"></script>
|
||||
<script src="../book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
241
today/book/daily/2025-06-08.html
Normal file
241
today/book/daily/2025-06-08.html
Normal file
@@ -0,0 +1,241 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>06-08-日刊 - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon.svg">
|
||||
<link rel="shortcut icon" href="../favicon.png">
|
||||
<link rel="stylesheet" href="../css/variables.css">
|
||||
<link rel="stylesheet" href="../css/general.css">
|
||||
<link rel="stylesheet" href="../css/chrome.css">
|
||||
<link rel="stylesheet" href="../css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="../fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="../highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-202568"><a class="header" href="#ai洞察日报-202568">AI洞察日报 2025/6/8</a></h1>
|
||||
<p><strong>AI产品与功能更新</strong></p>
|
||||
<ol>
|
||||
<li>阿里巴巴于6月6日正式开源了全新的<strong>千问3向量模型</strong>系列<strong>Qwen3-Embedding</strong>,其在文本检索、聚类和分类等任务上的性能提升超40%,并超越谷歌和OpenAI的顶尖模型,获得了同类模型的<strong>最佳性能</strong>(SOTA),同时具备强大的多语言支持能力。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202504151007236218_3.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202504151007236218_3.jpg" alt="图片" title="img" /></a> <br/> 该系列共9款模型,已在魔搭社区、Hugging Face和GitHub等平台开源,并可通过阿里云百炼使用API服务,为全球开发者提供了更高效的AI应用空间。</li>
|
||||
<li><strong>AI</strong>驱动的本地视频编辑工具<strong>Diffusion Studio Pro</strong>正式亮相,该产品被誉为"CapCut + Cursor”结合,以本地优先、浏览器为基础的非线性编辑体验,集成了超过16种生成式<strong>AI模型</strong>,旨在降低创作门槛并大幅提升专业视频创作者的工作效率。其提供免费无限层级,有望成为AI驱动视频编辑的行业标杆,为创作者带来更高效、直观的创作体验。</li>
|
||||
<li>谷歌于6月5日发布了名为<strong>Portraits</strong>的创新<strong>AI产品</strong>,用户可通过与虚拟专家进行实时对话,获得个性化的沟通技巧与领导力学习体验,首批虚拟专家基于知名畅销书作者打造。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0606/6388480752743547666381573.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0606/6388480752743547666381573.png" alt="图片" title="img" /></a> <br/> 该产品依托谷歌先进的<strong>生成式AI技术</strong>,强调交互性和实践性,目前仅对美国IP用户开放测试,预示着<strong>AI教育</strong>将迈向更互动、更个性化的新阶段。</li>
|
||||
</ol>
|
||||
<p><strong>AI前沿研究</strong></p>
|
||||
<ol>
|
||||
<li>在第七届"北京智源大会”上,智源研究院重磅推出了一系列名为"悟界”的<strong>大模型</strong>,其中包括原生多模态世界模型<strong>Emu3</strong>、脑科学多模态通用基础模型见微<strong>Brainμ</strong>,以及具身智能的协作框架<strong>RoboOS2.0</strong>和<strong>RoboBrain2.0</strong>等。 <br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202307211343352678_2.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202307211343352678_2.jpg" alt="图片" title="img" /></a> <br/> 这些模型旨在推动人工智能在医疗、教育、环境监测等多个重要领域的应用落地,展现了智源研究院在<strong>多模态智能技术</strong>方面的雄心和实力。</li>
|
||||
</ol>
|
||||
<p><strong>开源TOP项目</strong></p>
|
||||
<ol>
|
||||
<li><strong>react-bits</strong>是一个拥有<strong>12729</strong>星的开源<strong>React组件集合</strong>,它提供动画、交互式且完全可定制的组件,旨在帮助开发者构建出令人惊叹且难以忘怀的用户界面。项目地址:<a href="https://github.com/DavidHDev/react-bits">Link</a>。</li>
|
||||
<li><strong>art-design-pro</strong>是一个拥有<strong>1729</strong>星的Vue 3管理后台模板,它采用Vite + TypeScript + Element Plus构建,专注于优化用户体验和视觉设计。项目地址:<a href="https://github.com/Daymychen/art-design-pro">Link</a>。</li>
|
||||
</ol>
|
||||
<p><strong>社媒分享</strong></p>
|
||||
<ol>
|
||||
<li>刘勿锋分享了用<strong>Claude</strong>画图时的一个实用小技巧:通过简单的提示词,可以指导Claude调用如<strong>iconfont</strong>、<strong>Lucied React图标库</strong>等第三方图标库,而非使用系统默认的emoji,从而大幅提升前端网页的视觉美观度和风格统一性。 <br/> <a href="https://cdnv2.ruguoapp.com/Fmks9yCJBJ1rO-T5g9BPepCxci-v3.png"><img src="https://cdnv2.ruguoapp.com/Fmks9yCJBJ1rO-T5g9BP9epCxci-v3.png" alt="图片" title="img" /></a> <br/> <br/> <a href="https://cdnv2.ruguoapp.com/FqkHGytOOk8dLy3WejWlcbSLAIBqv3.png"><img src="https://cdnv2.ruguoapp.com/FqkHGytOOk8dLy3WejWlcbSLAIBqv3.png" alt="图片" title="img" /></a> <br/> 更多详情请访问:<a href="https://m.okjike.com/originalPosts/68444463dfa0f1ef3adbbf9b">Link</a>。</li>
|
||||
<li>wwwgoubuli预估接下来社交媒体上将出现两种热门内容:一部分是深入分析<strong>作文题目</strong>的讨论,另一部分则是围绕<strong>AI写作文</strong>展开的创作比拼,展现了对当前AI应用趋势的敏锐观察。更多信息:<a href="https://x.com/wwwgoubuli/status/1931206161044484395">Link</a>。</li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../daily/2025-06-09.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-07.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../daily/2025-06-09.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-07.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr.min.js"></script>
|
||||
<script src="../mark.min.js"></script>
|
||||
<script src="../searcher.js"></script>
|
||||
|
||||
<script src="../clipboard.min.js"></script>
|
||||
<script src="../highlight.js"></script>
|
||||
<script src="../book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
247
today/book/daily/2025-06-09.html
Normal file
247
today/book/daily/2025-06-09.html
Normal file
@@ -0,0 +1,247 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>06-09-日刊 - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon.svg">
|
||||
<link rel="shortcut icon" href="../favicon.png">
|
||||
<link rel="stylesheet" href="../css/variables.css">
|
||||
<link rel="stylesheet" href="../css/general.css">
|
||||
<link rel="stylesheet" href="../css/chrome.css">
|
||||
<link rel="stylesheet" href="../css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="../fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="../highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-202569"><a class="header" href="#ai洞察日报-202569">AI洞察日报 2025/6/9</a></h1>
|
||||
<p><strong>AI产品与功能更新</strong></p>
|
||||
<ol>
|
||||
<li><strong>OpenAI</strong> 宣布 <strong>ChatGPT</strong> 高级语音功能升级,显著提升了语音交互的自然性和流畅度,使其<strong>语调更自然、节奏更真实、情绪表达更丰富</strong>,并加入了<strong>双向自动翻译</strong>功能,能持续进行多轮对话翻译,无需重复指令,特别适用于国际出行、远程办公和语言学习等场景。</li>
|
||||
<li>面壁智能于6月6日发布了 <strong>MiniCPM 4.0系列</strong> 模型,包括8B稀疏版和0.5B轻巧版,在端侧性能上实现了<strong>极限情况下220倍、常规5倍的速度提升</strong>,通过<strong>系统级稀疏创新</strong>和高效双频换挡技术,大幅减少了端侧存储需求,并已成功适配Intel、高通等主流芯片。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0608/6388497352726253514384248.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0608/6388497352726253514384248.png" alt="图片" title="img" /></a> <br/></li>
|
||||
</ol>
|
||||
<p><strong>开源TOP项目</strong></p>
|
||||
<ol>
|
||||
<li><strong>tensorzero</strong> (<a href="https://github.com/tensorzero/tensorzero">Link</a>) 是一款拥有4869个Star的项目,它为LLM应用创建了一个<strong>反馈循环</strong>,旨在将生产数据转化为更智能、更快、更经济的模型。</li>
|
||||
<li><strong>HumanSystemOptimization</strong> (<a href="https://github.com/zijie0/HumanSystemOptimization">Link</a>) 是一个拥有15170个Star的项目,提供了一份名为"<strong>健康学习到150岁</strong>”的<strong>人体系统调优指南</strong>。</li>
|
||||
<li><strong>omni-tools</strong> (<a href="https://github.com/iib0011/omni-tools">Link</a>) 拥有2940个Star,它提供了一套<strong>自托管的网页工具集</strong>,用于日常任务,强调<strong>无广告、无跟踪</strong>,且可在浏览器中快速便捷使用。</li>
|
||||
<li><strong>BlackFriday-GPTs-Prompts</strong> (<a href="https://github.com/friuns2/BlackFriday-GPTs-Prompts">Link</a>) 是一个拥有7018个Star的项目,提供了<strong>无需Plus订阅即可使用的免费GPTs列表</strong>。</li>
|
||||
</ol>
|
||||
<p><strong>社媒分享</strong></p>
|
||||
<ol>
|
||||
<li>ginobefun分享了关于 <strong>RAG技巧与底层代码剖析</strong> 的文章(<a href="https://x.com/hongming731/status/1931695593300295887">Link</a>),强调通过手写代码理解RAG核心逻辑,并详细介绍了<strong>语义分块</strong>与<strong>上下文增强检索</strong>如何提升大模型问答质量。</li>
|
||||
<li>黄赟认为 <strong>AI数字人</strong> 将成为电商平台的标配(<a href="https://x.com/huangyun_122/status/1931651642912575799">Link</a>),并提到近期<strong>AI主播被"开发者模式”玩坏</strong>的现象,导致技术服务商需紧急修复漏洞。</li>
|
||||
<li>歸藏展示了 <strong>FLUX kontext</strong> 在修改汽车宣传图方面的强大能力(<a href="https://m.okjike.com/originalPosts/684554a3f2a4a64de9113b05">Link</a>),能将汽车背景更换为黄昏沙滩或赛道,并智能地为行驶中的车轮<strong>添加运动模糊效果</strong>。
|
||||
<br/> <a href="https://cdnv2.ruguoapp.com/FgYlujbzq6TyHy_7vk80onRQz2s0v3.png"><img src="https://cdnv2.ruguoapp.com/FgYlujbzq6TyHy_7vk80onRQz2s0v3.png" alt="图片" title="img" /></a> <br/>
|
||||
<br/> <a href="https://cdnv2.ruguoapp.com/Frl3Mso4Vw3AJ0TMEhauKTMf1KJSv3.png"><img src="https://cdnv2.ruguoapp.com/Frl3Mso4Vw3AJ0TMEhauKTMf1KJSv3.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>izx-copy分享了Google的建议(<a href="https://m.okjike.com/originalPosts/684547c3380c5253de2afdb8">Link</a>),鼓励开发者直接使用其高质量的<strong>深度研究代码库</strong>,而非自行开发,认为其比"vibe coding”版本更优。
|
||||
<br/> <a href="https://cdnv2.ruguoapp.com/Fq5xvk7MirT9ygZ10T5hIx3lWRlvv3.jpg"><img src="https://cdnv2.ruguoapp.com/Fq5xvk7MirT9ygZ10T5hIx3lWRlvv3.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>Yangyi呼吁开发 <strong>"睿智的AI”</strong> (<a href="https://x.com/Yangyixxxx/status/1931568827126743513">Link</a>),即能够<strong>快速识别幻觉和虚假信息</strong>的AI,并提出了<strong>AI幻觉专家网络</strong>的概念,认为这能帮助AI自主辨别信息真伪,提升输出可靠性。</li>
|
||||
<li>pimgeek转发了一篇关于公司<strong>用ChatGPT替代客服导致翻车</strong>的文章(<a href="https://mp.weixin.qq.com/s/68NngKn8nhZEziLkRvBcTg">Link</a>),文章指出用户更倾向于与真人客服沟通,数据显示多数用户不希望产品引入AI客服,甚至会因此考虑更换竞争对手。
|
||||
<br/> <a href="https://mmbiz.qpic.cn/mmbiz_jpg/kKoeb9t5fNrx85xJ2bibZStRvd1w55tu3rasGH4r7WyxZ3ECSxozia6DZvicBZcXVKhsUSCSKw47gnesic2RfDztsQ/0?wx_fmt=jpeg"><img src="https://mmbiz.qpic.cn/mmbiz_jpg/kKoeb9t5fNrx85xJ2bibZStRvd1w55tu3rasGH4r7WyxZ3ECSxozia6DZvicBZcXVKhsUSCSKw47gnesic2RfDztsQ/0?wx_fmt=jpeg" alt="图片" title="img" /></a> <br/></li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../daily/2025-06-10.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-08.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../daily/2025-06-10.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-08.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr.min.js"></script>
|
||||
<script src="../mark.min.js"></script>
|
||||
<script src="../searcher.js"></script>
|
||||
|
||||
<script src="../clipboard.min.js"></script>
|
||||
<script src="../highlight.js"></script>
|
||||
<script src="../book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
286
today/book/daily/2025-06-10.html
Normal file
286
today/book/daily/2025-06-10.html
Normal file
@@ -0,0 +1,286 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>06-10-日刊 - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon.svg">
|
||||
<link rel="shortcut icon" href="../favicon.png">
|
||||
<link rel="stylesheet" href="../css/variables.css">
|
||||
<link rel="stylesheet" href="../css/general.css">
|
||||
<link rel="stylesheet" href="../css/chrome.css">
|
||||
<link rel="stylesheet" href="../css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="../fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="../highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-2025610"><a class="header" href="#ai洞察日报-2025610">AI洞察日报 2025/6/10</a></h1>
|
||||
<p><strong>AI产品与功能更新</strong></p>
|
||||
<ol>
|
||||
<li>
|
||||
<p>Google 近日调整 <strong>AI 模型</strong>使用政策,自5月起,<strong>Google AI Studio</strong> 已停止向免费用户提供 <strong>Gemini 2.5 Pro</strong> 系列模型调用权限,未来开发者需自行提供 <strong>API 密钥</strong>接入服务。此举引发了开发者社区的广泛关注,分析认为这是 Google 推动 <strong>Gemini</strong> 商业化进程、将高性能模型纳入付费体系的信号。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202312070835429226_0.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202312070835429226_0.jpg" alt="图片" title="img" /></a> <br/></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>据官方数据显示,阿里旗下<strong>通义千问3</strong>大模型开源仅一个月,其全球累计下载量已突破<strong>1250万次</strong>,并在 Hugging Face 等主流 <strong>AI</strong> 开源平台上,衍生模型数量超过<strong>13万个</strong>,跃居全球第一。这一爆发式增长不仅代表着国产大模型的开源实力正与国际水平接轨,也进一步巩固了阿里在全球 <strong>AI 基础模型生态</strong>中的影响力。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202504151007248027_6.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202504151007248027_6.jpg" alt="图片" title="img" /></a> <br/></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>轻量级文档解析模型 <strong>MonkeyOCR</strong> 近日震撼登场,它以仅<strong>3B参数</strong>的轻量级架构,在英文文档解析任务中展现出惊艳性能,超越了 <strong>Gemini 2.5 Pro</strong> 等重量级模型,并大幅提升了处理速度。其核心创新在于采用"<strong>结构-识别-关系</strong>”三元组范式,这不仅提升了解析准确率,还显著降低了计算资源需求,为中小型企业部署 <strong>AI</strong> 文档解析解决方案提供了可能。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0609/6388506551370676562538551.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0609/6388506551370676562538551.png" alt="图片" title="img" /></a> <br/>
|
||||
论文链接:<a href="https://arxiv.org/abs/2506.05218">https://arxiv.org/abs/2506.05218</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>在近期一场采用2025年高考新课标Ⅰ卷客观题的数学挑战中,<strong>字节</strong>的<strong>豆包</strong>和<strong>腾讯</strong>的<strong>元宝</strong>表现出色,以68分的成绩并列第一,充分展现了其在复杂推理场景下的潜力。此次比赛不仅揭示了各大 <strong>AI 模型</strong>在高考数学上的能力与不足,也反映出它们在细节处理、公式应用和逻辑推理方面的显著进步,为未来 <strong>AI 数学能力</strong>的发展奠定了基础。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0609/6388506262201100345390287.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0609/6388506262201100345390287.png" alt="图片" title="img" /></a> <br/>
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0609/6388506263798259217980699.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0609/6388506263798259217980699.png" alt="图片" title="img" /></a> <br/></p>
|
||||
</li>
|
||||
</ol>
|
||||
<p><strong>AI行业展望与社会影响</strong></p>
|
||||
<ol>
|
||||
<li>
|
||||
<p>架构师<strong>罗伯特・卡鲁索</strong>近日进行了一项跨时代实验,结果显示1977年推出的<strong>Atari 2600</strong>游戏机国际象棋引擎轻松击败了 <strong>OpenAI</strong> 的 <strong>ChatGPT</strong>。<strong>ChatGPT</strong> 在比赛中频繁犯错、混淆棋子,这引发了公众对<strong>复古科技</strong>与<strong>现代 AI</strong> 棋艺水平的讨论和反思。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202307141649254569_3.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202307141649254569_3.jpg" alt="图片" title="img" /></a> <br/></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>博主 <strong>wwwgoubuli</strong> 认为 <strong>AI 编程代理</strong>正进入平台期,尽管当前模型如 <strong>Gemini 2.5 Pro</strong> 和 <strong>Claude</strong> 表现强劲,但模型层面的"飞升”空间有限。他预计未来将有更多产品井喷式发展,而重点在于<strong>载体</strong>、<strong>媒介</strong>和 <strong>IDE/plugin</strong> 等方面的完善,而非核心模型能力的突破。
|
||||
<a href="https://x.com/wwwgoubuli/status/1931898011904598439">Link</a></p>
|
||||
</li>
|
||||
</ol>
|
||||
<p><strong>开源TOP项目</strong></p>
|
||||
<ol>
|
||||
<li>
|
||||
<p><strong>vosk-api</strong> 是一个拥有<strong>10342</strong>颗星的开源项目,它提供适用于 <strong>Android</strong>、<strong>iOS</strong>、<strong>树莓派</strong>和服务器的<strong>离线语音识别 API</strong>,并支持 <strong>Python</strong>、<strong>Java</strong>、<strong>C#</strong> 和 <strong>Node</strong> 等多语言开发。
|
||||
<a href="https://github.com/alphacep/vosk-api">Link</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>RAG_Techniques</strong> 是一个拥有<strong>17002</strong>颗星的开源项目,该仓库展示了<strong>检索增强生成(RAG)系统</strong>的各种先进技术。它结合了<strong>信息检索</strong>和<strong>生成模型</strong>,旨在为用户提供更加准确且上下文丰富的 <strong>AI</strong> 回复。
|
||||
<a href="https://github.com/NirDiamant/RAG_Techniques">Link</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Seelen-UI</strong> 是一个拥有<strong>7257</strong>颗星的开源项目,它提供了一个<strong>完全可定制</strong>的<strong>桌面环境</strong>,专为 <strong>Windows 10/11</strong> 用户设计,让用户能够打造个性化的操作界面。
|
||||
<a href="https://github.com/eythaann/Seelen-UI">Link</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Meng Shao</strong> 分享了5个精选的<strong>开源项目</strong>,旨在帮助 <strong>AI 工程师</strong>提升技能并获得"超能力”,尤其是在 <strong>LLMs</strong> 和生成式 <strong>AI Agent</strong> 领域。这些项目涵盖了从 <strong>LLM</strong> 基础知识、<strong>AI Agent</strong> 构建、生产级机器学习应用部署到<strong>提示工程</strong>等关键学习资源。
|
||||
<br/> <a href="https://pbs.twimg.com/media/Gs-Kw91bEAAfXUe?format=jpg&name=orig"><img src="https://pbs.twimg.com/media/Gs-Kw91bEAAfXUe?format=jpg&name=orig" alt="图片" title="img" /></a> <br/>
|
||||
<a href="https://x.com/shao__meng/status/1931915369754870114">Link</a></p>
|
||||
</li>
|
||||
</ol>
|
||||
<p><strong>社媒分享</strong></p>
|
||||
<ol>
|
||||
<li>
|
||||
<p>博主<strong>归藏</strong>详细介绍了如何在 <strong>Liblib</strong> 平台在线使用 <strong>FLUX Kontext</strong> 工具进行图片修改,无需本地运行 <strong>Comfyui</strong>,并分享了涵盖单图、双图、三图融合及图片放大功能的<strong>工作流</strong>。<strong>Liblib</strong> 上线的 <strong>Kontext</strong> 提供了便捷的在线处理能力,旨在帮助用户轻松掌握图片创作的各种高级技巧。
|
||||
<br/> <a href="https://cdnv2.ruguoapp.com/FgPX1CCXdu_RYpd92XdLLAZ2RFbBv3.png"><img src="https://cdnv2.ruguoapp.com/FgPX1CCXdu_RYpd92XdLLAZ2RFbBv3.png" alt="图片" title="img" /></a> <br/>
|
||||
<a href="https://m.okjike.com/originalPosts/68468cf4747af0f12129117c">Link</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Tw93</strong> 推荐了 <strong>PayQrcode</strong> 方案,该方案通过<strong>物理图片合并技术</strong>,成功将<strong>微信</strong>与<strong>支付宝</strong>收款码融合为单张图片,实现了线下离线场景下的<strong>双码兼容识别</strong>。这项创新解决了传统双码不便的问题,并经本地测试证明识别效果良好,极大地提升了支付便利性。
|
||||
<br/> <a href="https://pbs.twimg.com/media/Gs7XEppbgAA10Zw?format=jpg&name=orig"><img src="https://pbs.twimg.com/media/Gs7XEppbgAA10Zw?format=jpg&name=orig" alt="图片" title="img" /></a> <br/>
|
||||
<a href="https://x.com/HiTw93/status/1931860291278823822">Link</a></p>
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../daily/2025-06-11.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-09.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../daily/2025-06-11.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-09.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr.min.js"></script>
|
||||
<script src="../mark.min.js"></script>
|
||||
<script src="../searcher.js"></script>
|
||||
|
||||
<script src="../clipboard.min.js"></script>
|
||||
<script src="../highlight.js"></script>
|
||||
<script src="../book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
272
today/book/daily/2025-06-11.html
Normal file
272
today/book/daily/2025-06-11.html
Normal file
@@ -0,0 +1,272 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>06-11-日刊 - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="../favicon.svg">
|
||||
<link rel="shortcut icon" href="../favicon.png">
|
||||
<link rel="stylesheet" href="../css/variables.css">
|
||||
<link rel="stylesheet" href="../css/general.css">
|
||||
<link rel="stylesheet" href="../css/chrome.css">
|
||||
<link rel="stylesheet" href="../css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="../FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="../fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="../highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="../tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="../ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "../";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="../toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="../toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="../print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-2025611"><a class="header" href="#ai洞察日报-2025611">AI洞察日报 2025/6/11</a></h1>
|
||||
<p><strong>AI产品与功能更新</strong></p>
|
||||
<ol>
|
||||
<li><strong>豆包大模型家族</strong>将在2025 FORCE原动力大会上,重磅发布全新的<strong>豆包·视频生成模型</strong>。这款模型可谓"创意魔法棒”,它凭借高效结构和多任务统一建模等黑科技,不仅支持<strong>无缝多镜头叙事</strong>,还能<strong>精准响应多动作</strong>,甚至能像专业摄影师一样<strong>随心运镜</strong>,轻松生成写实、动漫等多种风格的<strong>高品质视频</strong>,简直是视频创作者的福音!
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388517021358447365987976.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388517021358447365987976.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>xAI开发的<strong>Grok</strong>人工智能正大刀阔斧地接管X平台的<strong>推荐算法</strong>,同时优化了评论排序机制。这意味着,平台将优先推荐<strong>高质量内容</strong>,而非仅仅看粉丝量,这无疑给那些粉丝较少但有真材实料的"小号”和新人带来了前所未有的曝光机会,旨在打造一个更公平、更开放的内容生态,让好内容不再"蒙尘”。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514989498792027745193.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514989498792027745193.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li><strong>豆包App</strong>近期也对"一句话P图”功能进行了全面升级,它基于强大的SeedEdit 3.0模型,新增了一键添加/替换文字、质感风格迁移和局部图像编辑增强等一系列酷炫修图玩法。这波升级简直是把专业修图师请进了手机,让普通用户也能无需专业技能,轻松搞定个性化照片创作,让"修图小白”也能变身"修图大师”。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514703219058043604298.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514703219058043604298.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>苹果在WWDC 2025大会上带来了iOS 26系统的"杀手级”功能——<strong>视觉智能</strong>。有了它,你可以在屏幕上的任何图片或信息上进行提问、搜索,甚至自动识别事件详情,简直是手机的"智能眼”。这项升级通过AI技术实现了屏幕内容的"一眼识别”,大大提升了交互体验的便捷性与智能化程度,还能自动提取事件信息加入日历,让你的数字生活更加省心。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514197880401555868249.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514197880401555868249.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>好消息!<strong>沉浸式翻译</strong>迎来重大更新,现在已能对<strong>推特(X)视频</strong>进行<strong>实时翻译</strong>。即便视频没有原生字幕,它也能帮你"神同步”地显示<strong>中英双语字幕</strong>。这下,刷X平台视频再也不用担心语言不通了,简直是跨文化交流的"神助攻”,彻底消除了语言障碍,让世界更近。
|
||||
<a href="https://x.com/imxiaohu/status/1932299897388277804">Link</a></li>
|
||||
</ol>
|
||||
<p><strong>AI前沿研究</strong></p>
|
||||
<ol>
|
||||
<li>香港大学和华为诺亚方舟实验室强强联手,推出了颠覆性的<strong>FUDOKI</strong>模型。这款模型采用<strong>非掩码离散流匹配架构</strong>,成功突破了传统自回归模型的束缚,实现了更加灵活高效的<strong>多模态生成与理解</strong>能力。它通过独特的<strong>并行去噪机制</strong>,显著提升了复杂推理和生成任务的表现,尤其在<strong>图像生成</strong>方面表现惊艳,为未来<strong>通用人工智能</strong>的发展铺平了道路。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202405161743136484_4.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202405161743136484_4.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>香港科技大学和快手科技的研究团队联合发布了<strong>EvoSearch(进化搜索)技术</strong>,这简直是AI作画领域的一股清流!它彻底颠覆了以往"大模型、大算力”的固有思维,巧妙地将达尔文的进化论思想融入AI生成过程,让那些"小个子”模型也能生成超越甚至媲美"大块头”的<strong>高质量图像和视频</strong>。这项突破性技术有望开启AI创作的**"智能进化”时代**,让AI模型在推理阶段释放更深层次的潜力。相关项目主页、代码和论文链接已发布:<a href="https://tinnerhrhe.github.io/evosearch/">https://tinnerhrhe.github.io/evosearch/</a>、<a href="https://github.com/tinnerhrhe/EvoSearch-codes">https://github.com/tinnerhrhe/EvoSearch-codes</a>、<a href="https://arxiv.org/abs/2505.17618">https://arxiv.org/abs/2505.17618</a>。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388516498517715873339996.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388516498517715873339996.png" alt="图片" /></a> <br/>
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388516503306155376085044.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388516503306155376085044.png" alt="图片" /></a> <br/></li>
|
||||
<li>一篇名为"<strong>玩中泛化:通过游戏学习推理</strong>”的学术论文揭示了令人兴奋的发现:<strong>多模态大型语言模型(MLLMs)<strong>通过玩简单的</strong>街机游戏</strong>,竟然能<strong>显著提升其跨领域的多模态推理能力</strong>,甚至超越了在特定数据上训练的<strong>专业模型</strong>!这无疑为未来<strong>通用AI能力的培养</strong>指明了一条充满趣味的新方向,让AI在"玩乐”中变得更聪明。
|
||||
<a href="https://arxiv.org/abs/2506.08011">此链接</a></li>
|
||||
<li>新论文《梦境之地》(<strong>Dreamland</strong>)提出了一种结合物理模拟器与大型生成模型的混合框架。它的目标是创造出高度可控且逼真的动态虚拟世界,不仅显著提升了图像质量与可控性,更重要的是,有望为<strong>具身AI智能体</strong>的训练提供一个理想的"游乐场”和"实验室”,助力AI在现实世界中更好地学习和行动。
|
||||
<a href="https://arxiv.org/abs/2506.08006">Link</a></li>
|
||||
</ol>
|
||||
<p><strong>AI行业展望与社会影响</strong></p>
|
||||
<ol>
|
||||
<li>理想汽车近期进行了组织架构的"大变身”,正式成立了**"空间机器人”<strong>和</strong>"穿戴机器人”<strong>两个全新的二级部门。这不仅仅是部门调整,更预示着理想汽车正从传统的汽车制造商转型为</strong>智能出行生态构建者**。他们旨在通过机器人技术,构建一个涵盖车内"第三空间”和车外智能穿戴设备的完整智能生活服务体系,这无疑将为理想汽车在竞争激烈的市场中带来新的差异化优势,让"第三空间”战略不再只是一个概念。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202105061137083176_6.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202105061137083176_6.jpg" alt="理想汽车" /></a> <br/></li>
|
||||
<li>俄亥俄州立大学宣布从今年起,将强制所有学生接受<strong>人工智能(AI)培训</strong>,这简直是为未来职场"量身定制”的技能包!学校推出了**"AI流利度”计划**,将AI教育全面融入本科生课程,旨在培养学生将专业知识与AI技术有效结合的能力。当然,学校也强调学生不得利用生成性AI来"蒙混过关”,同时加强教师培训以维护<strong>学术诚信</strong>。此举旨在确保每位毕业生都能在其专业领域有效应用AI,并积极响应俄亥俄州AI教育联盟在K-12教育中推动AI教育的努力,让AI真正成为每个人的"超级助手”。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202306251749094253_12.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202306251749094253_12.jpg" alt="学习 考试 高考 教育 (1)" /></a> <br/></li>
|
||||
<li>知名思考者李继刚一针见血地指出,当AI技术变得越发<strong>高效强大</strong>时,人类的<strong>判断力</strong>、<strong>品味</strong>和对事物<strong>目的的理解</strong>反而会变得更为<strong>硬核</strong>。因为AI虽然能生成万千方案并完美执行,却无法替代人类进行<strong>选择</strong>、定义<strong>美</strong>,更无法洞悉复杂且深邃的<strong>人性</strong>。这提醒我们,在AI时代,真正有价值的,或许正是那些AI无法企及的"人类专属技能”。
|
||||
<a href="https://m.okjike.com/originalPosts/68480c352b31fa0880f554c5">Link</a></li>
|
||||
</ol>
|
||||
<p><strong>开源TOP项目</strong></p>
|
||||
<ol>
|
||||
<li>小红书的 hi lab 团队近日献出了一份"大礼”——首个开源文本大模型<strong>dots.llm1</strong>!这款拥有1420亿参数的<strong>混合专家(MoE)语言模型</strong>,在海量真实数据训练后,其性能竟然能媲美阿里巴巴的Qwen2.5-72B,这简直是模型界的"黑马”!此次开源不仅彰显了小红书在人工智能领域的技术雄心,更旨在提供更智能化的服务,并激励开发者们一起加入AI研究的"大合唱”。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/201811151633429180_32.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/201811151633429180_32.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>近期,GitHub上两个<strong>AI相关</strong>的项目人气爆棚。其中,拥有10785星的"<strong>newsnow</strong>”项目,它旨在为用户提供<strong>优雅的实时热点新闻阅读体验</strong>,让信息获取既便捷又高效,简直是"新闻控”的福音,地址在这里:<a href="https://github.com/ourongxing/newsnow">此链接</a>。另一个是"<strong>GenAI_Agents</strong>”项目,以12884星的高热度,为开发者提供了<strong>从基础到高级的生成式AI智能体技术教程与实现</strong>,旨在赋能构建更智能的<strong>交互式AI系统</strong>,详情可访问:<a href="https://github.com/NirDiamant/GenAI_Agents">此链接</a>。</li>
|
||||
</ol>
|
||||
<p><strong>社媒分享</strong></p>
|
||||
<ol>
|
||||
<li>Gorden Sun在社交媒体上分享了<strong>Mirage</strong>虚拟人模型产品,这款产品简直是"数字分身”的魔法师!它能通过音频驱动,生成生动、嘴型同步且表情丰富的<strong>虚拟人视频</strong>,栩栩如生。Gorden Sun还特别强调,该产品的详细技术报告对研究人员具有极高的参考价值,看来又将引发一场虚拟人技术的"军备竞赛”。
|
||||
<a href="https://x.com/Gorden_Sun/status/1932446920884334635">Link</a></li>
|
||||
<li>Sam Altman在X平台发文宣布,<strong>o3产品</strong>价格已大幅下调80%,这简直是"福利大放送”!他表达了对用户创新使用的期待,并预告了<strong>o3-pro版本</strong>也将提供令人满意的定价。看来,Sora之父又在鼓励大家放开手脚,用更低的成本去探索AI的无限可能了。
|
||||
<a href="https://x.com/sama/status/1932434606558462459">Link</a></li>
|
||||
<li>Ryan ᵐᶠᵉʳ 🦄d/acc抛出了一个关于<strong>下一代创业者</strong>的深刻观点:他们不应被束缚于模仿乔布斯等前代成功模式,也不应受限于<strong>有限的低质量输入</strong>,而应<strong>忠于自我</strong>,以<strong>独特</strong>的"vibe”和<strong>玩乐精神</strong>去<strong>自由探索</strong>。这就像在说,别做别人的影子,去创造属于你自己的"游戏规则”!
|
||||
<a href="https://x.com/RyanMfer/status/1932387601341984815">Link</a></li>
|
||||
<li>用户wwwgoubuli分享了AI在实际工作中的一个有趣转变。他提到,远程团队成员初时因担心被视为偷懒而<strong>不敢充分使用AI</strong>,但在他多次分享AI"正确用法”后,团队逐渐"放开手脚”,结果代码的<strong>注释、规范和质量</strong>均显著提升,同事们也展现出更高的<strong>自信</strong>。这简直是AI赋能团队效率提升的"教科书式”案例,打破了心中的"AI焦虑”。
|
||||
<a href="https://x.com/wwwgoubuli/status/1932358909865480333">Link</a></li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
<a rel="prev" href="../2025-06-11.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-10.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
<a rel="prev" href="../2025-06-11.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||||
<i class="fa fa-angle-left"></i>
|
||||
</a>
|
||||
|
||||
<a rel="next prefetch" href="../daily/2025-06-10.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="../elasticlunr.min.js"></script>
|
||||
<script src="../mark.min.js"></script>
|
||||
<script src="../searcher.js"></script>
|
||||
|
||||
<script src="../clipboard.min.js"></script>
|
||||
<script src="../highlight.js"></script>
|
||||
<script src="../book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
10
today/book/elasticlunr.min.js
vendored
Normal file
10
today/book/elasticlunr.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
today/book/favicon.png
Normal file
BIN
today/book/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.5 KiB |
22
today/book/favicon.svg
Normal file
22
today/book/favicon.svg
Normal file
@@ -0,0 +1,22 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 199.7 184.2">
|
||||
<style>
|
||||
@media (prefers-color-scheme: dark) {
|
||||
svg { fill: white; }
|
||||
}
|
||||
</style>
|
||||
<path d="M189.5,36.8c0.2,2.8,0,5.1-0.6,6.8L153,162c-0.6,2.1-2,3.7-4.2,5c-2.2,1.2-4.4,1.9-6.7,1.9H31.4c-9.6,0-15.3-2.8-17.3-8.4
|
||||
c-0.8-2.2-0.8-3.9,0.1-5.2c0.9-1.2,2.4-1.8,4.6-1.8H123c7.4,0,12.6-1.4,15.4-4.1s5.7-8.9,8.6-18.4l32.9-108.6
|
||||
c1.8-5.9,1-11.1-2.2-15.6S169.9,0,164,0H72.7c-1,0-3.1,0.4-6.1,1.1l0.1-0.4C64.5,0.2,62.6,0,61,0.1s-3,0.5-4.3,1.4
|
||||
c-1.3,0.9-2.4,1.8-3.2,2.8S52,6.5,51.2,8.1c-0.8,1.6-1.4,3-1.9,4.3s-1.1,2.7-1.8,4.2c-0.7,1.5-1.3,2.7-2,3.7c-0.5,0.6-1.2,1.5-2,2.5
|
||||
s-1.6,2-2.2,2.8s-0.9,1.5-1.1,2.2c-0.2,0.7-0.1,1.8,0.2,3.2c0.3,1.4,0.4,2.4,0.4,3.1c-0.3,3-1.4,6.9-3.3,11.6
|
||||
c-1.9,4.7-3.6,8.1-5.1,10.1c-0.3,0.4-1.2,1.3-2.6,2.7c-1.4,1.4-2.3,2.6-2.6,3.7c-0.3,0.4-0.3,1.5-0.1,3.4c0.3,1.8,0.4,3.1,0.3,3.8
|
||||
c-0.3,2.7-1.3,6.3-3,10.8c-1.7,4.5-3.4,8.2-5,11c-0.2,0.5-0.9,1.4-2,2.8c-1.1,1.4-1.8,2.5-2,3.4c-0.2,0.6-0.1,1.8,0.1,3.4
|
||||
c0.2,1.6,0.2,2.8-0.1,3.6c-0.6,3-1.8,6.7-3.6,11c-1.8,4.3-3.6,7.9-5.4,11c-0.5,0.8-1.1,1.7-2,2.8c-0.8,1.1-1.5,2-2,2.8
|
||||
s-0.8,1.6-1,2.5c-0.1,0.5,0,1.3,0.4,2.3c0.3,1.1,0.4,1.9,0.4,2.6c-0.1,1.1-0.2,2.6-0.5,4.4c-0.2,1.8-0.4,2.9-0.4,3.2
|
||||
c-1.8,4.8-1.7,9.9,0.2,15.2c2.2,6.2,6.2,11.5,11.9,15.8c5.7,4.3,11.7,6.4,17.8,6.4h110.7c5.2,0,10.1-1.7,14.7-5.2s7.7-7.8,9.2-12.9
|
||||
l33-108.6c1.8-5.8,1-10.9-2.2-15.5C194.9,39.7,192.6,38,189.5,36.8z M59.6,122.8L73.8,80c0,0,7,0,10.8,0s28.8-1.7,25.4,17.5
|
||||
c-3.4,19.2-18.8,25.2-36.8,25.4S59.6,122.8,59.6,122.8z M78.6,116.8c4.7-0.1,18.9-2.9,22.1-17.1S89.2,86.3,89.2,86.3l-8.9,0
|
||||
l-10.2,30.5C70.2,116.9,74,116.9,78.6,116.8z M75.3,68.7L89,26.2h9.8l0.8,34l23.6-34h9.9l-13.6,42.5h-7.1l12.5-35.4l-24.5,35.4h-6.8
|
||||
l-0.8-35L82,68.7H75.3z"/>
|
||||
</svg>
|
||||
<!-- Original image Copyright Dave Gandy — CC BY 4.0 License -->
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
202
today/book/fonts/OPEN-SANS-LICENSE.txt
Normal file
202
today/book/fonts/OPEN-SANS-LICENSE.txt
Normal file
@@ -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.
|
||||
93
today/book/fonts/SOURCE-CODE-PRO-LICENSE.txt
Normal file
93
today/book/fonts/SOURCE-CODE-PRO-LICENSE.txt
Normal file
@@ -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.
|
||||
100
today/book/fonts/fonts.css
Normal file
100
today/book/fonts/fonts.css
Normal file
@@ -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');
|
||||
}
|
||||
BIN
today/book/fonts/open-sans-v17-all-charsets-300.woff2
Normal file
BIN
today/book/fonts/open-sans-v17-all-charsets-300.woff2
Normal file
Binary file not shown.
BIN
today/book/fonts/open-sans-v17-all-charsets-300italic.woff2
Normal file
BIN
today/book/fonts/open-sans-v17-all-charsets-300italic.woff2
Normal file
Binary file not shown.
BIN
today/book/fonts/open-sans-v17-all-charsets-600.woff2
Normal file
BIN
today/book/fonts/open-sans-v17-all-charsets-600.woff2
Normal file
Binary file not shown.
BIN
today/book/fonts/open-sans-v17-all-charsets-600italic.woff2
Normal file
BIN
today/book/fonts/open-sans-v17-all-charsets-600italic.woff2
Normal file
Binary file not shown.
BIN
today/book/fonts/open-sans-v17-all-charsets-700.woff2
Normal file
BIN
today/book/fonts/open-sans-v17-all-charsets-700.woff2
Normal file
Binary file not shown.
BIN
today/book/fonts/open-sans-v17-all-charsets-700italic.woff2
Normal file
BIN
today/book/fonts/open-sans-v17-all-charsets-700italic.woff2
Normal file
Binary file not shown.
BIN
today/book/fonts/open-sans-v17-all-charsets-800.woff2
Normal file
BIN
today/book/fonts/open-sans-v17-all-charsets-800.woff2
Normal file
Binary file not shown.
BIN
today/book/fonts/open-sans-v17-all-charsets-800italic.woff2
Normal file
BIN
today/book/fonts/open-sans-v17-all-charsets-800italic.woff2
Normal file
Binary file not shown.
BIN
today/book/fonts/open-sans-v17-all-charsets-italic.woff2
Normal file
BIN
today/book/fonts/open-sans-v17-all-charsets-italic.woff2
Normal file
Binary file not shown.
BIN
today/book/fonts/open-sans-v17-all-charsets-regular.woff2
Normal file
BIN
today/book/fonts/open-sans-v17-all-charsets-regular.woff2
Normal file
Binary file not shown.
BIN
today/book/fonts/source-code-pro-v11-all-charsets-500.woff2
Normal file
BIN
today/book/fonts/source-code-pro-v11-all-charsets-500.woff2
Normal file
Binary file not shown.
83
today/book/highlight.css
Normal file
83
today/book/highlight.css
Normal file
@@ -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;
|
||||
}
|
||||
54
today/book/highlight.js
Normal file
54
today/book/highlight.js
Normal file
File diff suppressed because one or more lines are too long
266
today/book/index.html
Normal file
266
today/book/index.html
Normal file
@@ -0,0 +1,266 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html lang="zh" class="light sidebar-visible" dir="ltr">
|
||||
<head>
|
||||
<!-- Book generated using mdBook -->
|
||||
<meta charset="UTF-8">
|
||||
<title>Today - By 何夕2077</title>
|
||||
|
||||
|
||||
<!-- Custom HTML head -->
|
||||
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
<link rel="icon" href="favicon.svg">
|
||||
<link rel="shortcut icon" href="favicon.png">
|
||||
<link rel="stylesheet" href="css/variables.css">
|
||||
<link rel="stylesheet" href="css/general.css">
|
||||
<link rel="stylesheet" href="css/chrome.css">
|
||||
<link rel="stylesheet" href="css/print.css" media="print">
|
||||
|
||||
<!-- Fonts -->
|
||||
<link rel="stylesheet" href="FontAwesome/css/font-awesome.css">
|
||||
<link rel="stylesheet" href="fonts/fonts.css">
|
||||
|
||||
<!-- Highlight.js Stylesheets -->
|
||||
<link rel="stylesheet" id="highlight-css" href="highlight.css">
|
||||
<link rel="stylesheet" id="tomorrow-night-css" href="tomorrow-night.css">
|
||||
<link rel="stylesheet" id="ayu-highlight-css" href="ayu-highlight.css">
|
||||
|
||||
<!-- Custom theme stylesheets -->
|
||||
|
||||
|
||||
<!-- Provide site root and default themes to javascript -->
|
||||
<script>
|
||||
const path_to_root = "";
|
||||
const default_light_theme = "light";
|
||||
const default_dark_theme = "navy";
|
||||
</script>
|
||||
<!-- Start loading toc.js asap -->
|
||||
<script src="toc.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="mdbook-help-container">
|
||||
<div id="mdbook-help-popup">
|
||||
<h2 class="mdbook-help-title">Keyboard shortcuts</h2>
|
||||
<div>
|
||||
<p>Press <kbd>←</kbd> or <kbd>→</kbd> to navigate between chapters</p>
|
||||
<p>Press <kbd>S</kbd> or <kbd>/</kbd> to search in the book</p>
|
||||
<p>Press <kbd>?</kbd> to show this help</p>
|
||||
<p>Press <kbd>Esc</kbd> to hide this help</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="body-container">
|
||||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||||
<script>
|
||||
try {
|
||||
let theme = localStorage.getItem('mdbook-theme');
|
||||
let sidebar = localStorage.getItem('mdbook-sidebar');
|
||||
|
||||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||||
}
|
||||
|
||||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||||
}
|
||||
} catch (e) { }
|
||||
</script>
|
||||
|
||||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||||
<script>
|
||||
const default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? default_dark_theme : default_light_theme;
|
||||
let theme;
|
||||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||||
const html = document.documentElement;
|
||||
html.classList.remove('light')
|
||||
html.classList.add(theme);
|
||||
html.classList.add("js");
|
||||
</script>
|
||||
|
||||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||||
|
||||
<!-- Hide / unhide sidebar before it is displayed -->
|
||||
<script>
|
||||
let sidebar = null;
|
||||
const sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||||
if (document.body.clientWidth >= 1080) {
|
||||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||||
sidebar = sidebar || 'visible';
|
||||
} else {
|
||||
sidebar = 'hidden';
|
||||
}
|
||||
sidebar_toggle.checked = sidebar === 'visible';
|
||||
html.classList.remove('sidebar-visible');
|
||||
html.classList.add("sidebar-" + sidebar);
|
||||
</script>
|
||||
|
||||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||||
<!-- populated by js -->
|
||||
<mdbook-sidebar-scrollbox class="sidebar-scrollbox"></mdbook-sidebar-scrollbox>
|
||||
<noscript>
|
||||
<iframe class="sidebar-iframe-outer" src="toc.html"></iframe>
|
||||
</noscript>
|
||||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||||
<div class="sidebar-resize-indicator"></div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div id="page-wrapper" class="page-wrapper">
|
||||
|
||||
<div class="page">
|
||||
<div id="menu-bar-hover-placeholder"></div>
|
||||
<div id="menu-bar" class="menu-bar sticky">
|
||||
<div class="left-buttons">
|
||||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||||
<i class="fa fa-bars"></i>
|
||||
</label>
|
||||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||||
<i class="fa fa-paint-brush"></i>
|
||||
</button>
|
||||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||||
<li role="none"><button role="menuitem" class="theme" id="default_theme">Auto</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||||
</ul>
|
||||
<button id="search-toggle" class="icon-button" type="button" title="Search (`/`)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="/ s" aria-controls="searchbar">
|
||||
<i class="fa fa-search"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<h1 class="menu-title">By 何夕2077</h1>
|
||||
|
||||
<div class="right-buttons">
|
||||
<a href="print.html" title="Print this book" aria-label="Print this book">
|
||||
<i id="print-button" class="fa fa-print"></i>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="search-wrapper" class="hidden">
|
||||
<form id="searchbar-outer" class="searchbar-outer">
|
||||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||||
</form>
|
||||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||||
<div id="searchresults-header" class="searchresults-header"></div>
|
||||
<ul id="searchresults">
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||||
<script>
|
||||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="content" class="content">
|
||||
<main>
|
||||
<h1 id="ai洞察日报-2025611"><a class="header" href="#ai洞察日报-2025611">AI洞察日报 2025/6/11</a></h1>
|
||||
<p><strong>AI产品与功能更新</strong></p>
|
||||
<ol>
|
||||
<li><strong>豆包大模型家族</strong>将在2025 FORCE原动力大会上,重磅发布全新的<strong>豆包·视频生成模型</strong>。这款模型可谓"创意魔法棒”,它凭借高效结构和多任务统一建模等黑科技,不仅支持<strong>无缝多镜头叙事</strong>,还能<strong>精准响应多动作</strong>,甚至能像专业摄影师一样<strong>随心运镜</strong>,轻松生成写实、动漫等多种风格的<strong>高品质视频</strong>,简直是视频创作者的福音!
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388517021358447365987976.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388517021358447365987976.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>xAI开发的<strong>Grok</strong>人工智能正大刀阔斧地接管X平台的<strong>推荐算法</strong>,同时优化了评论排序机制。这意味着,平台将优先推荐<strong>高质量内容</strong>,而非仅仅看粉丝量,这无疑给那些粉丝较少但有真材实料的"小号”和新人带来了前所未有的曝光机会,旨在打造一个更公平、更开放的内容生态,让好内容不再"蒙尘”。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514989498792027745193.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514989498792027745193.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li><strong>豆包App</strong>近期也对"一句话P图”功能进行了全面升级,它基于强大的SeedEdit 3.0模型,新增了一键添加/替换文字、质感风格迁移和局部图像编辑增强等一系列酷炫修图玩法。这波升级简直是把专业修图师请进了手机,让普通用户也能无需专业技能,轻松搞定个性化照片创作,让"修图小白”也能变身"修图大师”。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514703219058043604298.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514703219058043604298.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>苹果在WWDC 2025大会上带来了iOS 26系统的"杀手级”功能——<strong>视觉智能</strong>。有了它,你可以在屏幕上的任何图片或信息上进行提问、搜索,甚至自动识别事件详情,简直是手机的"智能眼”。这项升级通过AI技术实现了屏幕内容的"一眼识别”,大大提升了交互体验的便捷性与智能化程度,还能自动提取事件信息加入日历,让你的数字生活更加省心。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514197880401555868249.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388514197880401555868249.png" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>好消息!<strong>沉浸式翻译</strong>迎来重大更新,现在已能对<strong>推特(X)视频</strong>进行<strong>实时翻译</strong>。即便视频没有原生字幕,它也能帮你"神同步”地显示<strong>中英双语字幕</strong>。这下,刷X平台视频再也不用担心语言不通了,简直是跨文化交流的"神助攻”,彻底消除了语言障碍,让世界更近。
|
||||
<a href="https://x.com/imxiaohu/status/1932299897388277804">Link</a></li>
|
||||
</ol>
|
||||
<p><strong>AI前沿研究</strong></p>
|
||||
<ol>
|
||||
<li>香港大学和华为诺亚方舟实验室强强联手,推出了颠覆性的<strong>FUDOKI</strong>模型。这款模型采用<strong>非掩码离散流匹配架构</strong>,成功突破了传统自回归模型的束缚,实现了更加灵活高效的<strong>多模态生成与理解</strong>能力。它通过独特的<strong>并行去噪机制</strong>,显著提升了复杂推理和生成任务的表现,尤其在<strong>图像生成</strong>方面表现惊艳,为未来<strong>通用人工智能</strong>的发展铺平了道路。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202405161743136484_4.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202405161743136484_4.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>香港科技大学和快手科技的研究团队联合发布了<strong>EvoSearch(进化搜索)技术</strong>,这简直是AI作画领域的一股清流!它彻底颠覆了以往"大模型、大算力”的固有思维,巧妙地将达尔文的进化论思想融入AI生成过程,让那些"小个子”模型也能生成超越甚至媲美"大块头”的<strong>高质量图像和视频</strong>。这项突破性技术有望开启AI创作的**"智能进化”时代**,让AI模型在推理阶段释放更深层次的潜力。相关项目主页、代码和论文链接已发布:<a href="https://tinnerhrhe.github.io/evosearch/">https://tinnerhrhe.github.io/evosearch/</a>、<a href="https://github.com/tinnerhrhe/EvoSearch-codes">https://github.com/tinnerhrhe/EvoSearch-codes</a>、<a href="https://arxiv.org/abs/2505.17618">https://arxiv.org/abs/2505.17618</a>。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388516498517715873339996.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388516498517715873339996.png" alt="图片" /></a> <br/>
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388516503306155376085044.png"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/2025/0610/6388516503306155376085044.png" alt="图片" /></a> <br/></li>
|
||||
<li>一篇名为"<strong>玩中泛化:通过游戏学习推理</strong>”的学术论文揭示了令人兴奋的发现:<strong>多模态大型语言模型(MLLMs)<strong>通过玩简单的</strong>街机游戏</strong>,竟然能<strong>显著提升其跨领域的多模态推理能力</strong>,甚至超越了在特定数据上训练的<strong>专业模型</strong>!这无疑为未来<strong>通用AI能力的培养</strong>指明了一条充满趣味的新方向,让AI在"玩乐”中变得更聪明。
|
||||
<a href="https://arxiv.org/abs/2506.08011">此链接</a></li>
|
||||
<li>新论文《梦境之地》(<strong>Dreamland</strong>)提出了一种结合物理模拟器与大型生成模型的混合框架。它的目标是创造出高度可控且逼真的动态虚拟世界,不仅显著提升了图像质量与可控性,更重要的是,有望为<strong>具身AI智能体</strong>的训练提供一个理想的"游乐场”和"实验室”,助力AI在现实世界中更好地学习和行动。
|
||||
<a href="https://arxiv.org/abs/2506.08006">Link</a></li>
|
||||
</ol>
|
||||
<p><strong>AI行业展望与社会影响</strong></p>
|
||||
<ol>
|
||||
<li>理想汽车近期进行了组织架构的"大变身”,正式成立了**"空间机器人”<strong>和</strong>"穿戴机器人”<strong>两个全新的二级部门。这不仅仅是部门调整,更预示着理想汽车正从传统的汽车制造商转型为</strong>智能出行生态构建者**。他们旨在通过机器人技术,构建一个涵盖车内"第三空间”和车外智能穿戴设备的完整智能生活服务体系,这无疑将为理想汽车在竞争激烈的市场中带来新的差异化优势,让"第三空间”战略不再只是一个概念。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202105061137083176_6.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202105061137083176_6.jpg" alt="理想汽车" /></a> <br/></li>
|
||||
<li>俄亥俄州立大学宣布从今年起,将强制所有学生接受<strong>人工智能(AI)培训</strong>,这简直是为未来职场"量身定制”的技能包!学校推出了**"AI流利度”计划**,将AI教育全面融入本科生课程,旨在培养学生将专业知识与AI技术有效结合的能力。当然,学校也强调学生不得利用生成性AI来"蒙混过关”,同时加强教师培训以维护<strong>学术诚信</strong>。此举旨在确保每位毕业生都能在其专业领域有效应用AI,并积极响应俄亥俄州AI教育联盟在K-12教育中推动AI教育的努力,让AI真正成为每个人的"超级助手”。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202306251749094253_12.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/202306251749094253_12.jpg" alt="学习 考试 高考 教育 (1)" /></a> <br/></li>
|
||||
<li>知名思考者李继刚一针见血地指出,当AI技术变得越发<strong>高效强大</strong>时,人类的<strong>判断力</strong>、<strong>品味</strong>和对事物<strong>目的的理解</strong>反而会变得更为<strong>硬核</strong>。因为AI虽然能生成万千方案并完美执行,却无法替代人类进行<strong>选择</strong>、定义<strong>美</strong>,更无法洞悉复杂且深邃的<strong>人性</strong>。这提醒我们,在AI时代,真正有价值的,或许正是那些AI无法企及的"人类专属技能”。
|
||||
<a href="https://m.okjike.com/originalPosts/68480c352b31fa0880f554c5">Link</a></li>
|
||||
</ol>
|
||||
<p><strong>开源TOP项目</strong></p>
|
||||
<ol>
|
||||
<li>小红书的 hi lab 团队近日献出了一份"大礼”——首个开源文本大模型<strong>dots.llm1</strong>!这款拥有1420亿参数的<strong>混合专家(MoE)语言模型</strong>,在海量真实数据训练后,其性能竟然能媲美阿里巴巴的Qwen2.5-72B,这简直是模型界的"黑马”!此次开源不仅彰显了小红书在人工智能领域的技术雄心,更旨在提供更智能化的服务,并激励开发者们一起加入AI研究的"大合唱”。
|
||||
<br/> <a href="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/201811151633429180_32.jpg"><img src="https://autoproxy.justlikemaki.vip/?pp=https://pic.chinaz.com/picmap/201811151633429180_32.jpg" alt="图片" title="img" /></a> <br/></li>
|
||||
<li>近期,GitHub上两个<strong>AI相关</strong>的项目人气爆棚。其中,拥有10785星的"<strong>newsnow</strong>”项目,它旨在为用户提供<strong>优雅的实时热点新闻阅读体验</strong>,让信息获取既便捷又高效,简直是"新闻控”的福音,地址在这里:<a href="https://github.com/ourongxing/newsnow">此链接</a>。另一个是"<strong>GenAI_Agents</strong>”项目,以12884星的高热度,为开发者提供了<strong>从基础到高级的生成式AI智能体技术教程与实现</strong>,旨在赋能构建更智能的<strong>交互式AI系统</strong>,详情可访问:<a href="https://github.com/NirDiamant/GenAI_Agents">此链接</a>。</li>
|
||||
</ol>
|
||||
<p><strong>社媒分享</strong></p>
|
||||
<ol>
|
||||
<li>Gorden Sun在社交媒体上分享了<strong>Mirage</strong>虚拟人模型产品,这款产品简直是"数字分身”的魔法师!它能通过音频驱动,生成生动、嘴型同步且表情丰富的<strong>虚拟人视频</strong>,栩栩如生。Gorden Sun还特别强调,该产品的详细技术报告对研究人员具有极高的参考价值,看来又将引发一场虚拟人技术的"军备竞赛”。
|
||||
<a href="https://x.com/Gorden_Sun/status/1932446920884334635">Link</a></li>
|
||||
<li>Sam Altman在X平台发文宣布,<strong>o3产品</strong>价格已大幅下调80%,这简直是"福利大放送”!他表达了对用户创新使用的期待,并预告了<strong>o3-pro版本</strong>也将提供令人满意的定价。看来,Sora之父又在鼓励大家放开手脚,用更低的成本去探索AI的无限可能了。
|
||||
<a href="https://x.com/sama/status/1932434606558462459">Link</a></li>
|
||||
<li>Ryan ᵐᶠᵉʳ 🦄d/acc抛出了一个关于<strong>下一代创业者</strong>的深刻观点:他们不应被束缚于模仿乔布斯等前代成功模式,也不应受限于<strong>有限的低质量输入</strong>,而应<strong>忠于自我</strong>,以<strong>独特</strong>的"vibe”和<strong>玩乐精神</strong>去<strong>自由探索</strong>。这就像在说,别做别人的影子,去创造属于你自己的"游戏规则”!
|
||||
<a href="https://x.com/RyanMfer/status/1932387601341984815">Link</a></li>
|
||||
<li>用户wwwgoubuli分享了AI在实际工作中的一个有趣转变。他提到,远程团队成员初时因担心被视为偷懒而<strong>不敢充分使用AI</strong>,但在他多次分享AI"正确用法”后,团队逐渐"放开手脚”,结果代码的<strong>注释、规范和质量</strong>均显著提升,同事们也展现出更高的<strong>自信</strong>。这简直是AI赋能团队效率提升的"教科书式”案例,打破了心中的"AI焦虑”。
|
||||
<a href="https://x.com/wwwgoubuli/status/1932358909865480333">Link</a></li>
|
||||
</ol>
|
||||
|
||||
</main>
|
||||
|
||||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||||
<!-- Mobile navigation buttons -->
|
||||
|
||||
<a rel="next prefetch" href="daily/2025-06-11.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
|
||||
<div style="clear: both"></div>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||||
|
||||
<a rel="next prefetch" href="daily/2025-06-11.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||||
<i class="fa fa-angle-right"></i>
|
||||
</a>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
window.playground_copyable = true;
|
||||
</script>
|
||||
|
||||
|
||||
<script src="elasticlunr.min.js"></script>
|
||||
<script src="mark.min.js"></script>
|
||||
<script src="searcher.js"></script>
|
||||
|
||||
<script src="clipboard.min.js"></script>
|
||||
<script src="highlight.js"></script>
|
||||
<script src="book.js"></script>
|
||||
|
||||
<!-- Custom JS scripts -->
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user