增加反思CoT(思维链),完善提示词和gui工具

This commit is contained in:
minorQAQ committed 2026-06-27 18:35:28 +08:00
1 parent d6229959b5
commit 2d801911b5
89 files changed
+1130 -1038

No files matched your search

-344
View File
@@ -1,344 +0,0 @@
<html lang="zh-CN"><head>
<meta charset="UTF-8">
<title>哔哩哔哩 (゜-゜)つロ 干杯~-bilibili</title>
<meta name="description" content="哔哩哔哩(bilibili.com)是国内知名的视频弹幕网站,这里有及时的动漫新番,活跃的ACG氛围,有创意的Up主。大家可以在这里找到许多欢乐。">
<meta name="keywords" content="bilibili,哔哩哔哩,哔哩哔哩动画,哔哩哔哩弹幕网,弹幕视频,B站,弹幕,字幕,AMV,MAD,MTV,ANIME,动漫,动漫音乐,游戏,游戏解说,二次元,游戏视频,ACG,galgame,动画,番组,新番,初音,洛天依,vocaloid,日本动漫,国产动漫,手机游戏,网络游戏,电子竞技,ACG燃曲,ACG神曲,追新番,新番动漫,新番吐槽,巡音,镜音双子,千本樱,初音MIKU,舞蹈MMD,MIKUMIKUDANCE,洛天依原创曲,洛天依翻唱曲,洛天依投食歌,洛天依MMD,vocaloid家族,OST,BGM,动漫歌曲,日本动漫音乐,宫崎骏动漫音乐,动漫音乐推荐,燃系mad,治愈系mad,MAD MOVIE,MAD高燃">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="spm_prefix" content="333.1007">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta name="applicable-device" content="pc">
<meta http-equiv="Cache-Control" content="no-transform">
<meta http-equiv="Cache-Control" content="no-siteapp">
<meta name="server_render" content="is_server_render">
<link rel="dns-prefetch" href="//s1.hdslb.com">
<link rel="apple-touch-icon" href="https://i0.hdslb.com/bfs/static/jinkela/long/images/512.png">
<link rel="shortcut icon" href="https://i0.hdslb.com/bfs/static/jinkela/long/images/favicon.ico">
<link rel="canonical" href="https://www.bilibili.com/">
<link rel="alternate" media="only screen and (max-width: 640px)" href="https://m.bilibili.com">
<script>window._BiliGreyResult={"method":"base","grayVersion":"249026"}</script><script type="text/javascript">window.__bili_graystyle_fetched__=true</script>
<script type="text/javascript">
;(function () {
if (document.querySelector('meta[name=server_render]')) {
return
}
var ua = window.navigator.userAgent,
agents = ['Android', 'Phone', 'SymbianOS', 'iPod'],
isPC = true
if (/\sVR\s/g.test(ua)) return
for (var i = 0, len = agents.length; i < len; i++) {
if (ua.indexOf(agents[i]) > 0) {
isPC = false
break
}
}
if (!isPC) {
window.location.href = window.location.href.replace('www', 'm')
}
})()
</script>
<script src="//s1.hdslb.com/bfs/seed/jinkela/short/bmg/register/fallback.js"></script><script src="//s1.hdslb.com/bfs/seed/jinkela/kv-sdk/index.js"></script>
<!--preload-fetch-->
<script type="text/javascript">
window.__NANO_VERSION_HASH__ = "b237bb82"
</script>
<script type="text/javascript">
if (!window.abtest) {
window.abtest = {
'b_ut': '',
'home_version': 'V8',
'in_new_ab': true,
'ab_version': {"for_ai_home_version":"V8","rcmd_timeout_config":"550","home_performance_opt":"ssr_fetch_opt","force_go_download":"YES"},
'ab_split_num': {"for_ai_home_version":54,"rcmd_timeout_config":49,"home_performance_opt":49,"force_go_download":54},
'uniq_page_id': '707564570583',
'is_modern': true,
}
}
</script>
<script type="text/javascript">
window.spmReportData = {}
window.reportConfig = {
sample: 1,
msgObjects: 'spmReportData',
errorTracker: true
}
</script>
<script type="text/javascript" src="//s1.hdslb.com/bfs/seed/log/report/log-reporter.js"></script>
<script>
// bili-mirror 告警上报
const isBilibili = location.host.includes('bilibili.com')
const isSpider = !(navigator && navigator.userAgent) || /bot|spider/i.test(navigator.userAgent)
if (isBilibili && !isSpider) {
class MirrorErrorFilterPlugin {
static get errorFilterList() {
return ['extension', 'log-reporter', 'static.geetest.com']
}
static get rejectionFilterList() {
return ['extension', 'aborted', 'failed', 'timeout', 'network', 'log-reporter']
}
static get resourceFilterList() {
return ['extension']
}
// static cookieMidRegExp = /DedeUserID=(.+?);/
// static notBiliResourceRegExp = /^(?!.*\.hdslb\.com|.*\.bilibili\.com).*$/
checkInWhitelist(list, message, stack) {
if (!list || !list.length) return false
const isMsgMatch = message && list.some(str => {
return message.toLowerCase().includes(str)
})
const isStackMatch = stack && list.some(str => {
return stack.toLowerCase().includes(str)
})
return isMsgMatch || isStackMatch
}
mirrorHandleBefore(type, data) {
return new Promise(resolve => {
if (type === 'error') {
const isMatch = this.checkInWhitelist(
MirrorErrorFilterPlugin.errorFilterList,
data && data.message ? data.message : '',
data && data.stack ? data.stack : ''
)
return resolve(!isMatch)
}
else if (type === 'unhandledrejection') {
const isMatch = this.checkInWhitelist(
MirrorErrorFilterPlugin.rejectionFilterList,
data && data.message ? data.message : '',
data && data.stack ? data.stack : ''
)
return resolve(!isMatch)
}
else if (type === 'resource') {
const cookieMid = MirrorErrorFilterPlugin.cookieMidRegExp.exec(document.cookie)
MirrorErrorFilterPlugin.cookieMidRegExp.lastIndex = 0
if (!cookieMid) {
return resolve(false)
}
const isNotBiliResource = MirrorErrorFilterPlugin.notBiliResourceRegExp.test(data && data.message ? data.message : '')
MirrorErrorFilterPlugin.notBiliResourceRegExp.lastIndex = 0
if (isNotBiliResource) {
return resolve(false)
}
const isMatch = this.checkInWhitelist(
MirrorErrorFilterPlugin.resourceFilterList,
data && data.message ? data.message : '',
data && data.stack ? data.stack : ''
)
return resolve(!isMatch)
}
resolve(true)
})
}
mirrorHandleAfter() {
return Promise.resolve()
}
}
MirrorErrorFilterPlugin.cookieMidRegExp = /DedeUserID=(.+?);/
MirrorErrorFilterPlugin.notBiliResourceRegExp = /^(?!.*\.hdslb\.com|.*\.bilibili\.com).*$/
window.__MIRROR_CONFIG__ = {
origin: 'main',
module: 'home-page',
spmId: '333.1007',
plugins: new MirrorErrorFilterPlugin(),
config: {
isAutoInit: true,
whiteScreen: {
maxLoop: 10,
checkDom: ['#app', '.bili-feed4-layout', '.bili-mini-mask', '.geetest_panel_ghost', '#bewly', '.bewly-design', '.home-redesign-base', '.bilibili-helper-dark-mode', '.bili-wrapper'],
callback: status => {
console.log('白屏检测是否正常', status)
},
isSkeleton: false
},
ignoreVersion: '2.0.0',
ignorePageVersion: [108288]
}
}
}
</script>
<script src="//s1.hdslb.com/bfs/seed/jinkela/short/b-mirror/biliMirror.umd.mini.js"></script>
<script type="text/javascript">
/** 性能上报相关 */
function fsrCb() {
const t = new Date().getTime()
if (window.performance && window.performance.timing) {
window.performance.timing.firstscreenfinish = t
}
}
window.__HOME_PAGE_PERFORMANCE__ = {} // 赋值,防止后面使用存在判空报错
// 2024首页性能打点上报 start
var isHeaderBannerReported = false
function headerBannerLoaded() {
if (!isHeaderBannerReported) {
isHeaderBannerReported = true
window.__HOME_PAGE_PERFORMANCE__.header_static_img_load = +new Date() - window.performance.timing.navigationStart
if (window.__MIRROR_REPORT__ && typeof window.__MIRROR_REPORT__.customPerformanceQuota === 'function') {
window.__MIRROR_REPORT__.customPerformanceQuota({
name: 'header_static_img_load',
value: window.__HOME_PAGE_PERFORMANCE__.header_static_img_load,
})
}
}
}
var isFirstSwipeLoadReported = false
function firstSwipeLoaded(index) {
if (+index <= 1 && !isFirstSwipeLoadReported) {
isFirstSwipeLoadReported = true
window.__HOME_PAGE_PERFORMANCE__.swipe_img_load = +new Date() - window.performance.timing.navigationStart
if (window.__MIRROR_REPORT__ && typeof window.__MIRROR_REPORT__.customPerformanceQuota === 'function') {
window.__MIRROR_REPORT__.customPerformanceQuota({
name: 'swipe_img_load',
value: window.__HOME_PAGE_PERFORMANCE__.swipe_img_load,
})
}
}
}
var isFirstVideoCardImgLoadReported = false
function firstVideoCardImgLoaded() {
if (!isFirstVideoCardImgLoadReported) {
isFirstVideoCardImgLoadReported = true
window.__HOME_PAGE_PERFORMANCE__.videocard_img_load = +new Date() - window.performance.timing.navigationStart
if (window.__MIRROR_REPORT__ && typeof window.__MIRROR_REPORT__.customPerformanceQuota === 'function') {
window.__MIRROR_REPORT__.customPerformanceQuota({
name: 'videocard_img_load',
value: window.__HOME_PAGE_PERFORMANCE__.videocard_img_load,
})
}
}
}
// 2024首页性能打点上报 end
// 图片降级使用
function imgOnError(img) {
typeof window.imgAutoFallbackOnError === 'function' && window.imgAutoFallbackOnError(img)
}
// 图片降级使用
function imgOnLoad(img) {
typeof window.imgAutoFallbackOnLoad === 'function' && window.imgAutoFallbackOnLoad(img)
}
function lqipCb(img) {
var lqip =
img && img.parentNode && img.parentNode.querySelector('.lqip')
if (lqip) {
lqip.classList.add('is-active')
}
}
window.page_load_time = Date.now()
if (history.scrollRestoration) {
history.scrollRestoration = 'manual'
}
</script>
<link rel="stylesheet" href="//s1.hdslb.com/bfs/static/shanks/laputa-home/assets/index-88ff9ece.css">
<script type="module">import.meta.url;import("_").catch(()=>1);async function* g(){};if(location.protocol!="file:"){window.__vite_is_modern_browser=true}</script>
<script type="module">!function(){if(window.__vite_is_modern_browser)return;console.warn("vite: loading legacy chunks, syntax error above and the same error below should be ignored");var e=document.getElementById("vite-legacy-polyfill"),n=document.createElement("script");n.src=e.src,n.onload=function(){System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))},document.body.appendChild(n)}();</script>
<script src="//s1.hdslb.com/bfs/seed/jinkela/short/reporter-pb/index.js"></script><style>
.bytj55s3395dsk77, .bcn2oawtzhz1dpb8 {
pointer-events: none;
position: absolute;
top: 0;
left: 0;
width: 100%;
padding-top: var(--cover-radio);
background-color: var(--graph_bg_regular);
border-radius: 6px;
font-size: 14px;
color: var(--text4);
white-space: nowrap;
display: block!important;
}
.bytj55s3395dsk77::before, .bcn2oawtzhz1dpb8::before {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -100%);
content: '该内容被AdGuard/AdBlock类插件屏蔽';
}
.bytj55s3395dsk77::after, .bcn2oawtzhz1dpb8::after {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, 0);
content: '请检查插件以恢复正常内容展示';
}
</style><script id="bs_url_12298599294" type="text/JavaScript" src="//s1.hdslb.com/bfs/static/jinkela/long/unify-http-request/forticket.min.js"></script><script id="bs_url_5507829314" type="text/JavaScript" src="//s1.hdslb.com/bfs/seed/jinkela/short/watchlater-pip/watchlater-pip.umd.js"></script></head>
<body style="background-color: var(--bg3)" class="win">
<div class="browser-tip"></div>
<script>
if (
window.abtest &&
window.abtest.is_modern === false
) {
document.querySelector('.browser-tip').innerHTML =
'<div class="title">当前浏览器版本较低,为保证您的使用体验,建议使用最新版本的浏览器访问。</div>'
}
if (/(Mac|iPhone|iPod|iPad)/i.test(window.navigator.platform)) {
document.body.classList.add('mac')
} else {
document.body.classList.add('win')
}
</script>
<div id="app"><!--[--><!--[--><div class="bili-video-card__wrap __scale-wrap" data-v-a6998ac5=""><a href="//cm.bilibili.com" data-target-url="**" data-v-a6998ac5=""></a></div><!----><!--]--><div class="bili-feed4"><!--[--><div class="bili-header large-header"><div class="bili-header__bar"><ul class="left-entry"><li><a href="//www.bilibili.com" class="entry-title"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg" class="zhuzhan-icon"><path fill-rule="evenodd" clip-rule="evenodd" d="M3.73252 2.67094C3.33229 2.28484 3.33229 1.64373 3.73252 1.25764C4.11291 0.890684 4.71552 0.890684 5.09591 1.25764L7.21723 3.30403C7.27749 3.36218 7.32869 3.4261 7.37081 3.49407H10.5789C10.6211 3.4261 10.6723 3.36218 10.7325 3.30403L12.8538 1.25764C13.2342 0.890684 13.8368 0.890684 14.2172 1.25764C14.6175 1.64373 14.6175 2.28484 14.2172 2.67094L13.364 3.49407H14C16.2091 3.49407 18 5.28493 18 7.49407V12.9996C18 15.2087 16.2091 16.9996 14 16.9996H4C1.79086 16.9996 0 15.2087 0 12.9996V7.49406C0 5.28492 1.79086 3.49407 4 3.49407H4.58579L3.73252 2.67094ZM4 5.42343C2.89543 5.42343 2 6.31886 2 7.42343V13.0702C2 14.1748 2.89543 15.0702 4 15.0702H14C15.1046 15.0702 16 14.1748 16 13.0702V7.42343C16 6.31886 15.1046 5.42343 14 5.42343H4ZM5 9.31747C5 8.76519 5.44772 8.31747 6 8.31747C6.55228 8.31747 7 8.76519 7 9.31747V10.2115C7 10.7638 6.55228 11.2115 6 11.2115C5.44772 11.2115 5 10.7638 5 10.2115V9.31747ZM12 8.31747C11.4477 8.31747 11 8.76519 11 9.31747V10.2115C11 10.7638 11.4477 11.2115 12 11.2115C12.5523 11.2115 13 10.7638 13 10.2115V9.31747C13 8.76519 12.5523 8.31747 12 8.31747Z" fill="currentColor"></path></svg><span>首页</span></a></li><!----><!--[--><!--[--><li class="v-popover-wrap"><!--[--><a href="//www.bilibili.com/anime/" target="_blank" class="default-entry"><span>番剧</span></a><!--]--><!----></li><!----><!--]--><!--[--><li class="v-popover-wrap"><!--[--><a href="//live.bilibili.com" target="_blank" class="default-entry"><span>直播</span></a><!--]--><!----></li><!----><!--]--><!--[--><li class="v-popover-wrap"><!--[--><a href="//game.bilibili.com/platform" target="_blank" class="default-entry"><span>游戏中心</span></a><!--]--><!----></li><!----><!--]--><!--[--><li class="v-popover-wrap"><!--[--><a href="//show.bilibili.com/platform/home.html?msource=pc_web" target="_blank" class="default-entry"><span>会员购</span></a><!--]--><!----></li><!----><!--]--><!--[--><li class="v-popover-wrap"><!--[--><a href="//manga.bilibili.com?from=bill_top_mnav" target="_blank" class="default-entry"><span>漫画</span></a><!--]--><!----></li><!----><!--]--><!--[--><li class="v-popover-wrap"><!--[--><a href="//www.bilibili.com/match/home/" target="_blank" class="default-entry"><span>赛事</span></a><!--]--><!----></li><!----><!--]--><!--[--><!----><!----><!--]--><!--[--><!----><li class="v-popover-wrap left-loc-entry"><div><a class="loc-entry loc-moveclip" loc-id="2954" href="https://www.bilibili.com/bangumi/play/ss134633" target="_blank"><div class="loc-mc-box"><p class="loc-mc-box__text loc-mc-box__text--up">心间错</p><p class="loc-mc-box__pic"><img src="//i0.hdslb.com/bfs/banner/16ce15a437603d0d418b578b4523a0a88ad1a7f5.png" alt="图片"></p><p class="loc-mc-box__text loc-mc-box__text--down">心间错</p></div></a></div><!----></li><!--]--><!--]--><li class="v-popover-wrap"><!--[--><a href="//app.bilibili.com" target="_blank" class="download-entry download-client-trigger"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg" class="download-client-trigger__icon"><path d="M7.23181 8.65895V1.75796C7.23181 1.33935 7.57582 1 8.00018 1C8.42453 1 8.76854 1.33935 8.76854 1.75796V8.67097L9.98589 7.47009C10.286 7.17409 10.7725 7.17409 11.0725 7.47009C11.3726 7.7661 11.3726 8.24601 11.0725 8.54201L8.54958 11.0308C8.24952 11.3268 7.76302 11.3268 7.46295 11.0308L4.94002 8.54201C4.63995 8.24601 4.63995 7.7661 4.94002 7.47009C5.24008 7.17409 5.72658 7.17409 6.02665 7.47009L7.23181 8.65895Z" fill="currentColor"></path><path d="M3.48023 4.29936C2.40686 4.29936 1.53672 5.15772 1.53672 6.21656V11.5669C1.53672 12.6257 2.40686 13.4841 3.48023 13.4841H12.5198C13.5931 13.4841 14.4633 12.6257 14.4633 11.5669V6.21656C14.4633 5.15772 13.5931 4.29936 12.5198 4.29936H11.6158C11.1915 4.29936 10.8475 3.96001 10.8475 3.5414C10.8475 3.12279 11.1915 2.78344 11.6158 2.78344H12.5198C14.4418 2.78344 16 4.3205 16 6.21656V11.5669C16 13.4629 14.4418 15 12.5198 15H3.48023C1.55815 15 0 13.4629 0 11.5669V6.21656C0 4.3205 1.55815 2.78344 3.48023 2.78344H4.38418C4.80853 2.78344 5.15254 3.12279 5.15254 3.5414C5.15254 3.96001 4.80853 4.29936 4.38418 4.29936H3.48023Z" fill="currentColor"></path></svg><span>下载客户端</span><span class="new-icon"></span></a><!--]--><!----></li></ul><div class="center-search-container offset-center-search"><div class="center-search__bar"><form id="nav-searchform" class="" style="border-radius:8px 8px 8px 8px;"><div class="nav-search-content"><input clLine truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-0fe7dc61=""><!--]--><!--]--></picture><div class="animated-banner"></div><div class="header-banner__inner"><a href="//www.bilibili.com" class="inner-logo"><img class="logo-img" alt="B站 b站" width="162" height="78" src="//i1.hdslb.com/bfs/archive/87a5d03581e326f4f818cab3212ce471d1f6a064.png"></a><!----></div><div class="taper-line"></div><!----></div><div class="bili-header__channel" data-v-b65933a6=""><div class="channel-icons" data-v-b65933a6=""><!--[--><!----><a class="channel-icons__item" href="//t.bilibili.com" target="_blank" data-v-5913be20=""><div class="icon-bg icon-bg__dynamic" data-v-5913be20=""><svg width="22" height="23" viewBox="0 0 22 23" fill="none" xmlns="http://www.w3.org/2000/svg" class="icon-bg--icon" data-v-5913be20=""><path d="M6.41659 15.625C3.88528 15.625 1.83325 13.7782 1.83325 11.5H10.9999C10.9999 13.7782 8.94789 15.625 6.41659 15.625Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path><path d="M15.125 16.0827C15.125 18.614 13.2782 20.666 11 20.666L11 11.4993C13.2782 11.4993 15.125 13.5514 15.125 16.0827Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.875 6.91667C6.875 9.44797 8.72183 11.5 11 11.5L11 2.33333C8.72182 2.33333 6.875 4.38536 6.875 6.91667Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path><path d="M15.5833 7.375C13.052 7.375 11 9.22183 11 11.5H20.1667C20.1667 9.22183 18.1146 7.375 15.5833 7.375Z" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></svg></div><!----><span class="icon-title" data-v-5913be20="">动态</span></a><a href="//www.bilibili.com/v/popular/all" target="_blank" class="channel-icons__item"><div class="icon-bg icon-bg__popular"><svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg" class="icon-bg--icon"><path fill-rule="evenodd" clip-rule="evenodd" d="M4.89054 17.272L4.89277 17.2742C6.49674 18.8782 8.66472 19.7888 10.9624 19.7888C13.2503 19.7888 15.2113 19.0539 16.6107 17.6108L16.6108 17.6108L16.6128 17.6086C18.0002 16.1345 18.7835 14.182 18.7421 12.1819C18.7852 11.3835 18.6916 9.36321 17.4088 6.75488L17.4082 6.7537C17.209 6.35523 16.8163 6.06598 16.3391 5.96993C15.8904 5.87103 15.4021 6.01997 15.061 6.35741C14.9094 6.48781 14.7796 6.61755 14.6655 6.7317L14.6637 6.73348L14.6329 6.76426C14.2107 3.35588 12.6083 1.7368 11.1654 1.00465C11.148 0.987812 11.1265 0.967972 11.1036 0.950782C11.0775 0.931205 11.0311 0.900467 10.9694 0.888912C10.2276 0.608301 9.41043 1.01168 9.1237 1.77629L9.12314 1.7778C8.50566 3.46558 7.35287 4.62281 6.16627 5.76704C4.51756 7.33121 2.75938 9.03623 2.80163 12.093C2.75906 14.055 3.54464 15.8826 4.89054 17.272ZM3.04999 13.0648C3.01092 12.7459 2.99439 12.4218 3.00168 12.0939C2.95933 9.12977 4.6531 7.47834 6.30453 5.9116C7.49017 4.76831 8.67581 3.58267 9.31098 1.84655C9.56504 1.16904 10.2849 0.830288 10.9201 1.08435C10.9624 1.08435 11.0048 1.1267 11.0471 1.16904C11.9267 1.60884 12.8853 2.39635 13.5753 3.77299C12.8853 2.39633 11.9267 1.6088 11.0471 1.16901C11.0047 1.12666 10.9624 1.08432 10.9201 1.08432C10.2849 0.830251 9.56503 1.16901 9.31097 1.84651C8.6758 3.58263 7.49016 4.76827 6.30452 5.91157C4.65309 7.47831 2.95932 9.12973 3.00166 12.0938C2.99438 12.4218 3.01092 12.7459 3.04999 13.0648ZM14.477 7.18189C14.477 7.1819 14.477 7.18192 14.477 7.18193C14.5828 7.09724 14.6887 6.99138 14.8052 6.87493C14.9216 6.75849 15.0486 6.63146 15.1968 6.50442C15.4932 6.20801 15.9167 6.08098 16.2978 6.16567C16.7212 6.25036 17.06 6.50443 17.2294 6.84318C17.3088 7.0046 17.3835 7.16371 17.4539 7.32035C17.3835 7.1637 17.3087 7.00458 17.2294 6.84314C17.06 6.50439 16.7212 6.25032 16.2978 6.16563C15.9167 6.08094 15.4932 6.20798 15.1968 6.50439C15.0486 6.63142 14.9216 6.75845 14.8051 6.87489L14.8051 6.8749C14.7557 6.92437 14.7081 6.97191 14.6617 7.01675C14.5988 7.07745 14.5379 7.13318 14.477 7.18189ZM12.6977 6.35925C12.8428 7.15476 12.8833 7.97963 12.8679 8.74864C12.8679 8.79032 12.8704 8.8315 12.8754 8.87195C12.8704 8.83151 12.8679 8.79035 12.8679 8.74867C12.8833 7.97966 12.8428 7.15478 12.6977 6.35925ZM16.7358 10.6654C16.8108 11.1478 16.8483 11.6393 16.8483 12.1362V12.1786C16.8483 13.703 16.2978 15.2274 15.2392 16.3283C14.0535 17.4293 12.5291 18.0221 10.9201 17.9374C9.1416 17.9374 7.44783 17.2175 6.21984 15.9472C5.82743 15.5548 5.50448 15.1119 5.25584 14.6331C5.50447 15.1119 5.82743 15.5548 6.21983 15.9472C7.44782 17.2175 9.14159 17.9373 10.9201 17.9373C12.5291 18.022 14.0535 17.4292 15.2392 16.3283C16.2978 15.2273 16.8483 13.7029 16.8483 12.1785V12.1362C16.8483 11.6393 16.8108 11.1478 16.7358 10.6654ZM10.9306 17.7376C12.4802 17.8192 13.9509 17.2497 15.0989 16.1856C16.1154 15.1261 16.6483 13.655 16.6483 12.1785V12.1362C16.6483 10.8624 16.3969 9.6266 15.8955 8.49474C15.2436 9.11663 14.7845 9.49093 14.4179 9.68717C14.2122 9.79725 14.0268 9.85633 13.846 9.86789C13.6644 9.8795 13.5028 9.84219 13.3473 9.78249C12.9207 9.62211 12.6679 9.20129 1Line truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
"></picture></a></div></div></div><div style="" class="vui_carousel__slide vui_carousel__slide--next"><div class="carousel-area" data-index="0" data-v-ba17e0dd=""><div class="carousel-area-img" data-v-ba17e0dd=""><div data-v-ba17e0dd="" class="extension-tips-v2"></div><a data-loc-id="4694" class="carousel-item" data-v-ba17e0dd="" href="https://www.bilibili.com/video/BV1Q1j36FEfj" rel="noopener" target="_blank" data-target-url="https://www.bilibili.com/video/BV1Q1j36FEfj"><!----><!--[--><picture class="v-img carousel-inner__img" data-v-ba17e0dd="" data-v-339aeb28=""><!--[--><!--[--><source srcset="//i0.hdslb.com/bfs/banner/e2d2c18d68725eb5c256bbb69770222f0115d264.png@976w_550h_!web-home-carousel-cover.avif?mirror_report_swipe=1" type="image/avif" data-v-339aeb28=""><!--]--><!--[--><source srcset="//i0.hdslb.com/bfs/banner/e2d2c18d68725eb5c256bbb69770222f0115d264.png@976w_550h_!web-home-carousel-cover.webp?mirror_report_swipe=1" type="image/webp" data-v-339aeb28=""><!--]--><!--[--><img src="//i0.hdslb.com/bfs/banner/e2d2c18d68725eb5c256bbb69770222f0115d264.png@976w_550h_!web-home-carousel-cover?mirror_report_swipe=1" alt="来听伦敦大师赛胜者组应援金曲!" loading="eager" onload="fsrCb();firstSwipeLoaded(0)" onerror="
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-339aeb28=""><!--]--><!--]--></picture><!--]--></a></div></div></div><div style="" class="vui_carousel__slide"><div class="carousel-area" data-index="1" data-v-ba17e0dd=""><div class="carousel-area-img" data-v-ba17e0dd=""><div data-v-ba17e0dd="" class="extension-tips-v2"></div><a data-loc-id="4694" class="carousel-item" data-v-ba17e0dd="" href="//cm.bilibili.com/cm/api/fees/pc/sync/v2?msg=a%7C4696%2Cb%7Cbilibili%2Cc%7C0%2Cd%7C1%2Ce%7CCAAQABiAoJC7xrnynRAgACgAMCQ42CRCIDE3ODE2NzU2Njk4OTVxMTBhODRhMTY1YTE5N3EzMzcxSIfzlKHtM1IG6Z2S5bKbWgblsbHkuJxiBuS4reWbvWhkcAB4gICAgMAhgAEAiAHImAWSAQ4yMjIuMjA2LjE4LjE0NpoBAKABALIBICgHA8Grk3nfQUBPzs45MkRTum%2FQ%2ByXwonjofYYD6PJTugGkBmh0dHBzOi8vZ2FtZS1kYXRhLWFwaS5iaWxpZ2FtZS5jb20vdjIvYXBpL2NsaWNrL3BjX2JpbGk%2FYWNjb3VudF9pZD0zNiZjYW1wYWlnbl9pZD1fX0NBTVBBSUdOSURfXyZ1bml0X2lkPV9fVU5JVElEX18mY3JlYXRpdmVfaWQ9MTE2OTc1MDQwNzk3Nzg5Nzk4NCZzdXBwbHlfY2FsbGJhY2s9cGJhZXMuRVZubk5maGIxQkJNY1djb0pKdDZGRnM3Wk9qY2VtY1p0Y1N3enlrZTZkY190eVZCWllRUWVrZlQ3VUxaR0F5QnJSSEhDVkNPZ3ZQTTBCOUlLMGtYSmclM0QlM0QmY2FsbGJhY2tfdXJsPWh0dHBzJTNhJTJmJTJmY20uYmlsaWJpbGkuY29tJTJmY29udiUyZmFwaSUyZmNvbnZlcnNpb24lMmZhZCUyZmNiJTJmdjElM2Z0cmFja19pZCUzZHBiYWVzLkVWbm5OZmhiMUJCTWNXY29KSnQ2RkZzN1pPamNlbWNadGNTd3p5a2U2ZGNfdHlWQlpZUVFla2ZUN1VMWkdBeUJyUkhIQ1ZDT2d2UE0wQjlJSzBrWEpnJTNEJTNEJm1pZD0wJmlwPTIyMi4yMDYuMTguMTQ2JnJlcXVlc3RfaWQ9MTc4MTY3NTY2OTg5NXExMGE4NGExNjVhMTk3cTMzNzEmdHM9X19UU19fJnVhPU1vemlsbGElMkY1LjArJTI4V2luZG93cytOVCsxMC4wJTNCK1dpbjY0JTNCK3g2NCUyOStBcHBsZVdlYktpdCUyRjUzNy4zNislMjhLSFRNTCUyQytsaWtlK0dlY2tvJTI5K0Nocm9tZSUyRjE0OS4wLjAuMCtTYWZhcmklMkY1MzcuMzYrRWRnJTJGMTQ5LjAuMC4wJnNob3J0X3RyYWNraWQ9Y2FjM2JiMTNlMjE3NWYxYzRhYTlhNWVhM2NlY2Y4NjUmYWRfY2hhbm5lbF9pZD0zJmFkX2Y9ZGViNzRhYzU0Njc3NGNjMzhlMWFiMzMxMThkYmU2ZTMmZ2FtZV9pZD0xMTYyMsIBANIBANgBjALgAQDoAQDwAQCAAgKIAgC4AgDAAgDQAgDYAgDqAgDwAsrAK%2FgCAIgDAJIDAKgDALADALgDAMIDAMgDn40G0gObAXsiMSI6IjExNjk3NTA0MDc5Nzc4OTc5ODQiLCIyIjoiMzYiLCIzIjoiMzYiLCI2IjoiMzZfMCIsIjEyIjoiNDY5NiIsIjEzIjoiNyIsIjE0IjoiMCIsIjE1IjoiMCIsIjE2IjoiN18wIiwiMTciOiI0Njk0IiwiMTkiOiI4NTA2NCIsIjI1IjoiMTI5MCIsIjI2IjoiMTI5MSJ94AMA6AMA8AMA%2BgMFb3RoZXKCBAludWxsOm51bGyYBACgBACqBAQIABAEsAQA4gSMAjU2LnsicHNJZCI6MTM0MDQ2LCJ2MiI6IkFQQXF2Yk10TjJic3B6R0hXV3UwYmJhMVJ1emt6OF82YUtPTmgzLU1qTW9IRWJUUnJMd0QyN2JxTEVrYldoYzVsWUxrTjRIZjc3Yk1DcUpvWU05RkRLVlljR1Z0NlQtVHJzMTdiME9mM3dvb2RoUm5TYXlHWUhfaE91VEJTckV2N1JsLUZiUGpuQkN6eHRJVTY4WFdMai1wZTFWX0JmWXNfSXpoRWthWE5mZUluT2FHVVcwaVJBZyJ9OzYzLnsicHNJZCI6MTMzMDcxLCJ2MiI6IktPQSJ9OzcwLnsicHNJZCI6MTE0NzgwLCJ2MiI6IkFBIn36BAJ7fZAFgASQBYAGkAWBBpAFgQiQBYIGkAUEkAWFApAFjgKQBY8GkAWYApAFGZAFmgKQBZ0CkAWfApAFJpAFpgaQBasEkAWvBJAFsASQBbEEkAWyBJAFM5AFswKQBbQEkAW3ApAFtwiQBbgEkAW6BpAFO5AFQ5AFwwKQBUiQBcgIkAXMApAFzgKQBVOQBdMCkAXWApAF1wKQBdgCkAXaApAF3AKQBd8CkAVikAXlBJAF7QSQBfACkAX7ApAF%2FwKQBYQBkAWGAZAFhgOQBYgBkAWJAZAFjQOQBZIDkAWTB5AFlAOQBZgDkAWYEZAFmwOQBZwDkAWhB5AFogOQBaQDkAWnA5AFrAGQBbADkAWxAZAFsQOQBbMBkAW0AZAFwAOQBcEDkAXGBZAFyAGQBc0DkAXQAZAF0AOQBdMDkAXXA5AF2AGQBd8FkAXlA5AF6AGQBegDkAXqA5AF6wOQBfEBkAXyA5AF9QOQBfcDkAX4A5AF%2BgOQBfsDkAX%2FA6AFAMgFBNIFAOAFAw%3D%3D%2Cf%7Cclick_sync_3%2Cg%7C1%2Ch%7C2%2Ci%7C%2Cj%7C%2Ck%7C1781675673427%2Cl%7C4694%2Cm%7C1781675673345%2Cn%7C1%2Co%7C0%2Cp%7Cad_card&amp;ts=1781675673427" rel="noopener" target="_blank" data-target-url="https://game-data-api.biligame.com/v2/api/click/pc_bili?account_id=36&amp;campaign_id=__CAMPAIGNID__&amp;unit_id=__UNITID__&amp;creative_id=1169750407977897984&amp;supply_callback=pbaes.EVnnNfhb1BBMcWcoJJt6FFs7ZOjcemcZtcSwzyke6dc_tyVBZYQQekfT7ULZGAyBrRHHCVCOgvPM0B9IK0kXJg%3D%3D&amp;callback_url=https%3A%2F%2Fcm.bilibili.com%2Fconv%2Fapi%2Fconversion%2Fad%2Fcb%2Fv1%3Ftrack_id%3Dpbaes.EVnnNfhb1BBMcWcoJJt6FFs7ZOjcemcZtcSwzyke6dc_tyVBZYQQekfT7ULZGAyBrRHHCVCOgvPM0B9IK0kXJg%3D%3D&amp;mid=0&amp;ip=222.206.18.146&amp;request_id=1781675669895q10a84a165a197q3371&amp;ts=__TS__&amp;ua=Mozilla%2F5.0%2B(Windows%2BNT%2B10.0%3B%2BWin64%3B%2Bx64)%2BAppleWebKit%2F537.36%2B(KHTML%2C%2Blike%2BGecko)%2BChrome%2F149.0.0.0%2BSafari%2F537.36%2BEdg%2F149.0.0.0&amp;short_trackid=cac3bb13e2175f1c4aa9a5ea3cecf865&amp;ad_channel_id=3&amp;ad_f=deb74ac546774cc38e1ab33118dbe6e3&amp;game_id=11622"><!----><picture data-v-339aeb28="" data-v-ba17e0dd="" class="v-img carousel-inner__img"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/sycp_brand/creative_img/202606/bb8950e9f32288c590c07272b6d4526d.png@976w_550h_!web-home-carousel-cover.avif" type="image/avif"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/sycp_brand/creative_img/202606/bb8950e9f32288c590c07272b6d4526d.png@976w_550h_!web-home-carousel-cover.webp" type="image/webp"><img data-v-339aeb28="" src="//i1.hdslb.com/bfs/sycp_brand/creative_img/202606/bb8950e9f32288c590c07272b6d4526d.png@976w_550h_!web-home-carousel-cover" alt="百将牌上线炸弹房玩法!" loading="eager" onload="fsrCb();firstSwipeLoaded(1)" onerror="
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
"></picture></a></div></div></div><div style="" class="vui_carousel__slide"><div class="carousel-area" data-index="2" data-v-ba17e0dd=""><div class="carousel-area-img" data-v-ba17e0dd=""><div data-v-ba17e0dd="" class="extension-tips-v2"></div><a data-loc-id="4694" class="carousel-item" data-v-ba17e0dd="" href="https://www.bilibili.com/bangumi/play/ep4011535" rel="noopener" target="_blank" data-target-url="https://www.bilibili.com/bangumi/play/ep4011535"><!----><picture data-v-339aeb28="" data-v-ba17e0dd="" class="v-img carousel-inner__img"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/banner/e9ee88cc6b3b01834004f5615650781cf7b37237.png@976w_550h_!web-home-carousel-cover.avif" type="image/avif"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/banner/e9ee88cc6b3b01834004f5615650781cf7b37237.png@976w_550h_!web-home-carousel-cover.webp" type="image/webp"><img data-v-339aeb28="" src="//i1.hdslb.com/bfs/banner/e9ee88cc6b3b01834004f5615650781cf7b37237.png@976w_550h_!web-home-carousel-cover" alt="入围釜山电影节,海边唱响坚韧茂腔" loading="eager" onload="fsrCb();firstSwipeLoaded(2)" onerror="
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
"></picture></a></div></div></div><div style="" class="vui_carousel__slide"><div class="carousel-area" data-index="3" data-v-ba17e0dd=""><div class="carousel-area-img" data-v-ba17e0dd=""><div data-v-ba17e0dd="" class="extension-tips-v2"></div><a data-loc-id="4694" class="carousel-item" data-v-ba17e0dd="" href="https://www.bilibili.com/bangumi/play/ep4240251" rel="noopener" target="_blank" data-target-url="https://www.bilibili.com/bangumi/play/ep4240251"><!----><picture data-v-339aeb28="" data-v-ba17e0dd="" class="v-img carousel-inner__img"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/banner/f7e78feb43816aba709e0776b5d237904c7994b3.jpg@976w_550h_!web-home-carousel-cover.avif" type="image/avif"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/banner/f7e78feb43816aba709e0776b5d237904c7994b3.jpg@976w_550h_!web-home-carousel-cover.webp" type="image/webp"><img data-v-339aeb28="" src="//i1.hdslb.com/bfs/banner/f7e78feb43816aba709e0776b5d237904c7994b3.jpg@976w_550h_!web-home-carousel-cover" alt="生日回顾上线!贺峻霖June with Jun" loading="eager" onload="fsrCb();firstSwipeLoaded(3)" onerror="
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
"></picture></a></div></div></div><div style="" class="vui_carousel__slide"><div class="carousel-area" data-index="4" data-v-ba17e0dd=""><div class="carousel-area-img" data-v-ba17e0dd=""><div data-v-ba17e0dd="" class="extension-tips-v2"></div><a data-loc-id="4694" class="carousel-item" data-v-ba17e0dd="" href="https://www.bilibili.com/bangumi/play/ep3537933" rel="noopener" target="_blank" data-target-url="https://www.bilibili.com/bangumi/play/ep3537933"><!----><picture data-v-339aeb28="" data-v-ba17e0dd="" class="v-img carousel-inner__img"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/banner/e111a9c16c92a87935167502f786ddc7e34c8b73.png@976w_550h_!web-home-carousel-cover.avif" type="image/avif"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/banner/e111a9c16c92a87935167502f786ddc7e34c8b73.png@976w_550h_!web-home-carousel-cover.webp" type="image/webp"><img data-v-339aeb28="" src="//i1.hdslb.com/bfs/banner/e111a9c16c92a87935167502f786ddc7e34c8b73.png@976w_550h_!web-home-carousel-cover" alt="你有没有想过到外面去看看?" loading="eager" onload="fsrCb();firstSwipeLoaded(4)" onerror="
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
"></picture></a></div></div></div><div style="" class="vui_carousel__slide"><div class="carousel-area" data-index="5" data-v-ba17e0dd=""><div class="carousel-area-img" data-v-ba17e0dd=""><div data-v-ba17e0dd="" class="extension-tips-v2"></div><a data-loc-id="4694" class="carousel-item" data-v-ba17e0dd="" href="https://www.bilibili.com/video/BV1kcjg6gELc" rel="noopener" target="_blank" data-target-url="https://www.bilibili.com/video/BV1kcjg6gELc"><!----><picture data-v-339aeb28="" data-v-ba17e0dd="" class="v-img carousel-inner__img"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/banner/39ce4f07432f93e1db63eac4b07ee59472eda2c6.jpg@976w_550h_!web-home-carousel-cover.avif" type="image/avif"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/banner/39ce4f07432f93e1db63eac4b07ee59472eda2c6.jpg@976w_550h_!web-home-carousel-cover.webp" type="image/webp"><img data-v-339aeb28="" src="//i1.hdslb.com/bfs/banner/39ce4f07432f93e1db63eac4b07ee59472eda2c6.jpg@976w_550h_!web-home-carousel-cover" alt="梅西10大一条龙" loading="eager" onload="fsrCb();firstSwipeLoaded(5)" onerror="
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
"></picture></a></div></div></div><div style="" class="vui_carousel__slide"><div class="carousel-area" data-index="6" data-v-ba17e0dd=""><div class="carousel-area-img" data-v-ba17e0dd=""><div data-v-ba17e0dd="" class="extension-tips-v2"></div><a data-loc-id="4694" class="carousel-item" data-v-ba17e0dd="" href="https://www.bilibili.com/bangumi/play/ep336480" rel="noopener" target="_blank" data-target-url="https://www.bilibili.com/bangumi/play/ep336480"><!----><picture data-v-339aeb28="" data-v-ba17e0dd="" class="v-img carousel-inner__img"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/banner/131cb3ac05f437b67411a43457346da45941d43b.png@976w_550h_!web-home-carousel-cover.avif" type="image/avif"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/banner/131cb3ac05f437b67411a43457346da45941d43b.png@976w_550h_!web-home-carousel-cover.webp" type="image/webp"><img data-v-339aeb28="" src="//i1.hdslb.com/bfs/banner/131cb3ac05f437b67411a43457346da45941d43b.png@976w_550h_!web-home-carousel-cover" alt="梅西:从无名少年到绿茵传奇" loading="eager" onload="fsrCb();firstSwipeLoaded(6)" onerror="
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
"></picture></a></div></div></div><div style="" class="vui_carousel__slide"><div class="carousel-area" data-index="7" data-v-ba17e0dd=""><div class="carousel-area-img" data-v-ba17e0dd=""><div data-v-ba17e0dd="" class="extension-tips-v2"></div><a data-loc-id="4694" class="carousel-item" data-v-ba17e0dd="" href="//www.bilibili.com/video/BV1UFJN6jEZz?track_id=" rel="noopener" target="_blank" data-target-url="http://www.bilibili.com/video/BV1UFJN6jEZz?track_id="><!----><picture data-v-339aeb28="" data-v-ba17e0dd="" class="v-img carousel-inner__img"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/archive/8fdde637aaee057b244a01cd6931a1b0c253714f.jpg@976w_550h_!web-home-carousel-cover.avif" type="image/avif"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/archive/8fdde637aaee057b244a01cd6931a1b0c253714f.jpg@976w_550h_!web-home-carousel-cover.webp" type="image/webp"><img data-v-339aeb28="" src="//i1.hdslb.com/bfs/archive/8fdde637aaee057b244a01cd6931a1b0c253714f.jpg@976w_550h_!web-home-carousel-cover" alt="硬核视频播客:深度剖析近三个月国际局势" loading="eager" onload="fsrCb();firstSwipeLoaded(7)" onerror="
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
"></picture></a></div></div></div><div style="" class="vui_carousel__slide"><div class="carousel-area" data-index="8" data-v-ba17e0dd=""><div class="carousel-area-img" data-v-ba17e0dd=""><div data-v-ba17e0dd="" class="extension-tips-v2"></div><a data-loc-id="4694" class="carousel-item" data-v-ba17e0dd="" href="https://www.bilibili.com/bangumi/play/ep3409886" rel="noopener" target="_blank" data-target-url="https://www.bilibili.com/bangumi/play/ep3409886"><!----><picture data-v-339aeb28="" data-v-ba17e0dd="" class="v-img carousel-inner__img"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/banner/13804c38473d979b06f6fbc5ccc07b96efab2641.png@976w_550h_!web-home-carousel-cover.avif" type="image/avif"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/banner/13804c38473d979b06f6fbc5ccc07b96efab2641.png@976w_550h_!web-home-carousel-cover.webp" type="image/webp"><img data-v-339aeb28="" src="//i1.hdslb.com/bfs/banner/13804c38473d979b06f6fbc5ccc07b96efab2641.png@976w_550h_!web-home-carousel-cover" alt="今夜过后,长桉的传说将再添一笔" loading="eager" onload="fsrCb();firstSwipeLoaded(8)" onerror="
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
"></picture></a></div></div></div><div style="" class="vui_carousel__slide vui_carousel__slide--prev"><div class="carousel-area" data-index="0" data-v-ba17e0dd=""><div class="carousel-area-img" data-v-ba17e0dd=""><div data-v-ba17e0dd="" class="extension-tips-v2"></div><a data-loc-id="4694" class="carousel-item" data-v-ba17e0dd="" href="https://www.bilibili.com/video/BV1Q1j36FEfj" rel="noopener" target="_blank" data-target-url="https://www.bilibili.com/video/BV1Q1j36FEfj"><!----><!--[--><picture class="v-img carousel-inner__img" data-v-ba17e0dd="" data-v-339aeb28=""><!--[--><!--[--><source srcset="//i0.hdslb.com/bfs/banner/e2d2c18d68725eb5c256bbb69770222f0115d264.png@976w_550h_!web-home-carousel-cover.avif?mirror_report_swipe=1" type="image/avif" data-v-339aeb28=""><!--]--><!--[--><source srcset="//i0.hdslb.com/bfs/banner/e2d2c18d68725eb5c256bbb69770222f0115d264.png@976w_550h_!web-home-carousel-cover.webp?mirror_report_swipe=1" type="image/webp" data-v-339aeb28=""><!--]--><!--[--><img src="//i0.hdslb.com/bfs/banner/e2d2c18d68725eb5c256bbb69770222f0115d264.png@976w_550h_!web-home-carousel-cover?mirror_report_swipe=1" alt="来听伦敦大师赛胜者组应援金曲!" loading="eager" onload="fsrCb();firstSwipeLoaded(0)" onerror="
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-339aeb28=""><!--]--><!--]--></picture><!--]--></a></div></div></div><!--]--><div class="vui_carousel-transform clearfix"></div></div><!--[--><div class="carousel-footer" data-v-ba17e0dd=""><div class="carousel-footer-mask" style="background-color: rgb(70, 54, 65);" data-v-ba17e0dd=""></div><div class="carousel-footer-text" data-v-ba17e0dd=""><div class="carousel-footer-title" data-v-ba17e0dd=""><!----><a href="https://www.bilibili.com/video/BV1Q1j36FEfj" target="_blank" data-v-ba17e0dd=""><span data-v-ba17e0dd="">来听伦敦大师赛胜者组应援金曲!</span></a></div><!----></div><div class="carousel-dots" data-v-ba17e0dd=""><ul class="carousel-dots-list" data-v-ba17e0dd=""><!--[--><li class="carousel-dots-dot is-active" data-v-ba17e0dd=""><div class="before" data-v-ba17e0dd=""></div><div class="after" data-v-ba17e0dd=""></div></li><li class="carousel-dots-dot" data-v-ba17e0dd=""><div class="before" data-v-ba17e0dd=""></div><div class="after" data-v-ba17e0dd=""></div></li><li class="carousel-dots-dot" data-v-ba17e0dd=""><div class="before" data-v-ba17e0dd=""></div><div class="after" data-v-ba17e0dd=""></div></li><li class="carousel-dots-dot" data-v-ba17e0dd=""><div class="before" data-v-ba17e0dd=""></div><div class="after" data-v-ba17e0dd=""></div></li><li class="carousel-dots-dot" data-v-ba17e0dd=""><div class="before" data-v-ba17e0dd=""></div><div class="after" data-v-ba17e0dd=""></div></li><li class="carousel-dots-dot" data-v-ba17e0dd=""><div class="before" data-v-ba17e0dd=""></div><div class="after" data-v-ba17e0dd=""></div></li><li class="carousel-dots-dot" data-v-ba17e0dd=""><div class="before" data-v-ba17e0dd=""></div><div class="after" data-v-ba17e0dd=""></div></li><li class="carousel-dots-dot" data-v-ba17e0dd=""><div class="before" data-v-ba17e0dd=""></div><div class="after" data-v-ba17e0dd=""></div></li><li class="carousel-dots-dot" data-v-ba17e0dd=""><div class="before" data-v-ba17e0dd=""></div><div class="after" data-v-ba17e0dd=""></div></li><!--]--></ul></div></div><!--]--><!--[--><div class="carousel-arrows" data-v-ba17e0dd=""><button data-v-ba17e0dd=""><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" data-v-ba17e0dd=""><!--[--><path d="M15.4571 3.04289C15.8476 3.43342 15.8476 4.06658 15.4571 4.45711L8.09098 11.8232C7.99335 11.9209 7.99335 12.0791 8.09098 12.1768L15.4571 19.5429C15.8476 19.9334 15.8476 20.5666 15.4571 20.9571C15.0666 21.3476 14.4334 21.3476 14.0429 20.9571L6.67677 13.591C5.79809 12.7123 5.79809 11.2877 6.67677 10.409L14.0429 3.04289C14.4334 2.65237 15.0666 2.65237 15.4571 3.04289z" fill="currentColor"></path><!--]--></svg></button><button data-v-ba17e0dd=""><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" data-v-ba17e0dd=""><!--[--><path d="M8.5429 3.04289C8.15237 3.43342 8.15237 4.06658 8.5429 4.45711L15.909 11.8232C16.0066 11.9209 16.0066 12.0791 15.909 12.1768L8.5429 19.5429C8.15237 19.9334 8.15237 20.5666 8.5429 20.9571C8.93342 21.3476 9.56659 21.3476 9.95711 20.9571L17.3232 13.591C18.2019 12.7123 18.2019 11.2877 17.3232 10.409L9.95711 3.04289C9.56659 2.65237 8.93342 2.65237 8.5429 3.04289z" fill="currentColor"></path><!--]--></svg></button></div><!--]--></div></div></div></div></div></div></div><!--[--><!--[--><div class="feed-card" data-v-8b105adf=""><div class="bili-feed-card" data-v-8b105adf=""><div class="bili-video-card is-rcmd" style="--cover-radio:56.25%;"><!----><!----><div class="bili-video-card__wrap"><div class="bili-video-card__no-interest" style="display: none;"><div class="bili-video-card__no-interest--inner"><div class="bili-video-card__no-interest--left"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 36 36" width="36" height="36" class="no-interest-icon" fill="currentColor"><path d="M3 18C3 9.715724999999999 9.715724999999999 3 18 3C26.284274999999997 3 33 9.715724999999999 33 18C33 26.284274999999997 26.284274999999997 33 18 33C9.715724999999999 33 3 26.284274999999997 3 18zM12.796710000000001 12.694004999999999C12.358049999999999 12.253995 11.645745 12.2529 11.205735 12.691575C10.765709999999999 13.130234999999999 10.764615 13.842555 11.20329 14.282565000000002L13.41144 16.494975L11.20329 18.7074C10.764615 19.147350000000003 10.765709999999999 19.8597 11.205735 20.298375C11.645745 20.73705 12.358049999999999 20.735925 12.796710000000001 20.295975L15.2682 17.81895C15.99795 17.087175000000002 15.99795 15.902775000000002 15.2682 15.17097L12.796710000000001 12.694004999999999zM24.794325 12.691575C24.354300000000002 12.2529 23.64195 12.253995 23.203274999999998 12.694004999999999L20.7318 15.17097C20.00205 15.902775000000002 20.00205 17.087175000000002 20.7318 17.81895L23.203274999999998 20.295975C23.64195 20.735925 24.354300000000002 20.73705 24.794325 20.298375C25.234274999999997 19.8597 25.2354 19.147350000000003 24.796725000000002 1Line truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-339aeb28=""><!--]--><!--]--></picture><div class="v-inline-player"></div></div><div class="bili-video-card__mask"><div class="bili-video-card__stats"><div class="bili-video-card__stats--left"><!--[--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M14.7138 10.96875C15.50765 11.4271 15.50765 12.573 14.71375 13.0313L11.5362 14.8659C10.74235 15.3242 9.75 14.7513 9.75001 13.8346L9.75001 10.1655C9.75001 9.24881 10.74235 8.67587 11.5362 9.13422L14.7138 10.96875z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">260.9万</span></span><!--]--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M15.875 10.75L9.875 10.75C9.46079 10.75 9.125 10.4142 9.125 10C9.125 9.58579 9.46079 9.25 9.875 9.25L15.875 9.25C16.2892 9.25 16.625 9.58579 16.625 10C16.625 10.4142 16.2892 10.75 15.875 10.75z" fill="currentColor"></path><path d="M17.375 14.75L11.375 14.75C10.9608 14.75 10.625 14.4142 10.625 14C10.625 13.5858 10.9608 13.25 11.375 13.25L17.375 13.25C17.7892 13.25 18.125 13.5858 18.125 14C18.125 14.4142 17.7892 14.75 17.375 14.75z" fill="currentColor"></path><path d="M7.875 10C7.875 10.4142 7.53921 10.75 7.125 10.75L6.625 10.75C6.21079 10.75 5.875 10.4142 5.875 10C5.875 9.58579 6.21079 9.25 6.625 9.25L7.125 9.25C7.53921 9.25 7.875 9.58579 7.875 10z" fill="currentColor"></path><path d="M9.375 14C9.375 14.4142 9.03921 14.75 8.625 14.75L8.125 14.75C7.71079 14.75 7.375 14.4142 7.375 14C7.375 13.5858 7.71079 13.25 8.125 13.25L8.625 13.25C9.03921 13.25 9.375 13.5858 9.375 14z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">322</span></span></div><span class="bili-video-card__stats__duration">01:52</span></div></div></div></a><div style="" class="bili-video-card__info"><div class="bili-video-card__info--right"><!--[--><div class="bili-video-card__info--no-interest" style="display:none;"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="bili-video-card__info--no-interest--icon" fill="currentColor"><!--[--><path d="M13.62335 5.49835C13.62335 6.3949 12.8966 7.12171 12 7.12171C11.10345 7.12171 10.37665 6.3949 10.37665 5.49835C10.37665 4.6018 11.10345 3.875 12 3.875C12.8966 3.875 13.62335 4.6018 13.62335 5.49835zM13.62345 18.4985C13.62345 19.3951 12.8966 20.12195 12 20.12195C11.10335 20Line truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-339aeb28=""><!--]--><!--]--></picture><div class="v-inline-player"></div></div><div class="bili-video-card__mask"><div class="bili-video-card__stats"><div class="bili-video-card__stats--left"><!--[--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M14.7138 10.96875C15.50765 11.4271 15.50765 12.573 14.71375 13.0313L11.5362 14.8659C10.74235 15.3242 9.75 14.7513 9.75001 13.8346L9.75001 10.1655C9.75001 9.24881 10.74235 8.67587 11.5362 9.13422L14.7138 10.96875z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">133.9万</span></span><!--]--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M15.875 10.75L9.875 10.75C9.46079 10.75 9.125 10.4142 9.125 10C9.125 9.58579 9.46079 9.25 9.875 9.25L15.875 9.25C16.2892 9.25 16.625 9.58579 16.625 10C16.625 10.4142 16.2892 10.75 15.875 10.75z" fill="currentColor"></path><path d="M17.375 14.75L11.375 14.75C10.9608 14.75 10.625 14.4142 10.625 14C10.625 13.5858 10.9608 13.25 11.375 13.25L17.375 13.25C17.7892 13.25 18.125 13.5858 18.125 14C18.125 14.4142 17.7892 14.75 17.375 14.75z" fill="currentColor"></path><path d="M7.875 10C7.875 10.4142 7.53921 10.75 7.125 10.75L6.625 10.75C6.21079 10.75 5.875 10.4142 5.875 10C5.875 9.58579 6.21079 9.25 6.625 9.25L7.125 9.25C7.53921 9.25 7.875 9.58579 7.875 10z" fill="currentColor"></path><path d="M9.375 14C9.375 14.4142 9.03921 14.75 8.625 14.75L8.125 14.75C7.71079 14.75 7.375 14.4142 7.375 14C7.375 13.5858 7.71079 13.25 8.125 13.25L8.625 13.25C9.03921 13.25 9.375 13.5858 9.375 14z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">2648</span></span></div><span class="bili-video-card__stats__duration">10:09</span></div></div></div></a><div style="" class="bili-video-card__info"><div class="bili-video-card__info--right"><!--[--><div class="bili-video-card__info--no-interest" style="display:none;"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="bili-video-card__info--no-interest--icon" fill="currentColor"><!--[--><path d="M13.62335 5.49835C13.62335 6.3949 12.8966 7.12171 12 7.12171C11.10345 7.12171 10.37665 6.3949 10.37665 5.49835C10.37665 4.6018 11.10345 3.875 12 3.875C12.8966 3.875 13.62335 4.6018 13.62335 5.49835zM13.62345 18.4985C13.62345 19.3951 12.8966 20.12195 12 20.12195C11.10335 2Line truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-339aeb28=""><!--]--><!--]--></picture><div class="v-inline-player"></div></div><div class="bili-video-card__mask"><div class="bili-video-card__stats"><div class="bili-video-card__stats--left"><!--[--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M14.7138 10.96875C15.50765 11.4271 15.50765 12.573 14.71375 13.0313L11.5362 14.8659C10.74235 15.3242 9.75 14.7513 9.75001 13.8346L9.75001 10.1655C9.75001 9.24881 10.74235 8.67587 11.5362 9.13422L14.7138 10.96875z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">305.5万</span></span><!--]--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M15.875 10.75L9.875 10.75C9.46079 10.75 9.125 10.4142 9.125 10C9.125 9.58579 9.46079 9.25 9.875 9.25L15.875 9.25C16.2892 9.25 16.625 9.58579 16.625 10C16.625 10.4142 16.2892 10.75 15.875 10.75z" fill="currentColor"></path><path d="M17.375 14.75L11.375 14.75C10.9608 14.75 10.625 14.4142 10.625 14C10.625 13.5858 10.9608 13.25 11.375 13.25L17.375 13.25C17.7892 13.25 18.125 13.5858 18.125 14C18.125 14.4142 17.7892 14.75 17.375 14.75z" fill="currentColor"></path><path d="M7.875 10C7.875 10.4142 7.53921 10.75 7.125 10.75L6.625 10.75C6.21079 10.75 5.875 10.4142 5.875 10C5.875 9.58579 6.21079 9.25 6.625 9.25L7.125 9.25C7.53921 9.25 7.875 9.58579 7.875 10z" fill="currentColor"></path><path d="M9.375 14C9.375 14.4142 9.03921 14.75 8.625 14.75L8.125 14.75C7.71079 14.75 7.375 14.4142 7.375 14C7.375 13.5858 7.71079 13.25 8.125 13.25L8.625 13.25C9.03921 13.25 9.375 13.5858 9.375 14z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">1295</span></span></div><span class="bili-video-card__stats__duration">02:59</span></div></div></div></a><div style="" class="bili-video-card__info"><div class="bili-video-card__info--right"><!--[--><div class="bili-video-card__info--no-interest" style="display:none;"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="bili-video-card__info--no-interest--icon" fill="currentColor"><!--[--><path d="M13.62335 5.49835C13.62335 6.3949 12.8966 7.12171 12 7.12171C11.10345 7.12171 10.37665 6.3949 10.37665 5.49835C10.37665 4.6018 11.10345 3.875 12 3.875C12.8966 3.875 13.62335 4.6018 13.62335 5.49835zM13.62345 18.4985C13.62345 19.3951 12.8966 20.12195 12 20.12195C11.10335 2Line truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-339aeb28=""><!--]--><!--]--></picture><div class="v-inline-player"></div></div><div class="bili-video-card__mask"><div class="bili-video-card__stats"><div class="bili-video-card__stats--left"><!--[--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M14.7138 10.96875C15.50765 11.4271 15.50765 12.573 14.71375 13.0313L11.5362 14.8659C10.74235 15.3242 9.75 14.7513 9.75001 13.8346L9.75001 10.1655C9.75001 9.24881 10.74235 8.67587 11.5362 9.13422L14.7138 10.96875z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">248.0万</span></span><!--]--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M15.875 10.75L9.875 10.75C9.46079 10.75 9.125 10.4142 9.125 10C9.125 9.58579 9.46079 9.25 9.875 9.25L15.875 9.25C16.2892 9.25 16.625 9.58579 16.625 10C16.625 10.4142 16.2892 10.75 15.875 10.75z" fill="currentColor"></path><path d="M17.375 14.75L11.375 14.75C10.9608 14.75 10.625 14.4142 10.625 14C10.625 13.5858 10.9608 13.25 11.375 13.25L17.375 13.25C17.7892 13.25 18.125 13.5858 18.125 14C18.125 14.4142 17.7892 14.75 17.375 14.75z" fill="currentColor"></path><path d="M7.875 10C7.875 10.4142 7.53921 10.75 7.125 10.75L6.625 10.75C6.21079 10.75 5.875 10.4142 5.875 10C5.875 9.58579 6.21079 9.25 6.625 9.25L7.125 9.25C7.53921 9.25 7.875 9.58579 7.875 10z" fill="currentColor"></path><path d="M9.375 14C9.375 14.4142 9.03921 14.75 8.625 14.75L8.125 14.75C7.71079 14.75 7.375 14.4142 7.375 14C7.375 13.5858 7.71079 13.25 8.125 13.25L8.625 13.25C9.03921 13.25 9.375 13.5858 9.375 14z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">7422</span></span></div><span class="bili-video-card__stats__duration">01:32</span></div></div></div></a><div style="" class="bili-video-card__info"><div class="bili-video-card__info--right"><!--[--><div class="bili-video-card__info--no-interest" style="display:none;"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="bili-video-card__info--no-interest--icon" fill="currentColor"><!--[--><path d="M13.62335 5.49835C13.62335 6.3949 12.8966 7.12171 12 7.12171C11.10345 7.12171 10.37665 6.3949 10.37665 5.49835C10.37665 4.6018 11.10345 3.875 12 3.875C12.8966 3.875 13.62335 4.6018 13.62335 5.49835zM13.62345 18.4985C13.62345 19.3951 12.8966 20.12195 12 20.12195C11.10335 2Line truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-339aeb28=""><!--]--><!--]--></picture><div class="v-inline-player"></div></div><div class="bili-video-card__mask"><div class="bili-video-card__stats"><div class="bili-video-card__stats--left"><!--[--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M14.7138 10.96875C15.50765 11.4271 15.50765 12.573 14.71375 13.0313L11.5362 14.8659C10.74235 15.3242 9.75 14.7513 9.75001 13.8346L9.75001 10.1655C9.75001 9.24881 10.74235 8.67587 11.5362 9.13422L14.7138 10.96875z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">95.0万</span></span><!--]--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M15.875 10.75L9.875 10.75C9.46079 10.75 9.125 10.4142 9.125 10C9.125 9.58579 9.46079 9.25 9.875 9.25L15.875 9.25C16.2892 9.25 16.625 9.58579 16.625 10C16.625 10.4142 16.2892 10.75 15.875 10.75z" fill="currentColor"></path><path d="M17.375 14.75L11.375 14.75C10.9608 14.75 10.625 14.4142 10.625 14C10.625 13.5858 10.9608 13.25 11.375 13.25L17.375 13.25C17.7892 13.25 18.125 13.5858 18.125 14C18.125 14.4142 17.7892 14.75 17.375 14.75z" fill="currentColor"></path><path d="M7.875 10C7.875 10.4142 7.53921 10.75 7.125 10.75L6.625 10.75C6.21079 10.75 5.875 10.4142 5.875 10C5.875 9.58579 6.21079 9.25 6.625 9.25L7.125 9.25C7.53921 9.25 7.875 9.58579 7.875 10z" fill="currentColor"></path><path d="M9.375 14C9.375 14.4142 9.03921 14.75 8.625 14.75L8.125 14.75C7.71079 14.75 7.375 14.4142 7.375 14C7.375 13.5858 7.71079 13.25 8.125 13.25L8.625 13.25C9.03921 13.25 9.375 13.5858 9.375 14z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">304</span></span></div><span class="bili-video-card__stats__duration">05:31</span></div></div></div></a><div style="" class="bili-video-card__info"><div class="bili-video-card__info--right"><!--[--><div class="bili-video-card__info--no-interest" style="display:none;"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="bili-video-card__info--no-interest--icon" fill="currentColor"><!--[--><path d="M13.62335 5.49835C13.62335 6.3949 12.8966 7.12171 12 7.12171C11.10345 7.12171 10.37665 6.3949 10.37665 5.49835C10.37665 4.6018 11.10345 3.875 12 3.875C12.8966 3.875 13.62335 4.6018 13.62335 5.49835zM13.62345 18.4985C13.62345 19.3951 12.8966 20.12195 12 20.12195C11.10335 20.Line truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-339aeb28=""><!--]--><!--]--></picture><div class="v-inline-player"></div></div><div class="bili-video-card__mask"><div class="bili-video-card__stats"><div class="bili-video-card__stats--left"><!--[--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M14.7138 10.96875C15.50765 11.4271 15.50765 12.573 14.71375 13.0313L11.5362 14.8659C10.74235 15.3242 9.75 14.7513 9.75001 13.8346L9.75001 10.1655C9.75001 9.24881 10.74235 8.67587 11.5362 9.13422L14.7138 10.96875z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">79.7万</span></span><!--]--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M15.875 10.75L9.875 10.75C9.46079 10.75 9.125 10.4142 9.125 10C9.125 9.58579 9.46079 9.25 9.875 9.25L15.875 9.25C16.2892 9.25 16.625 9.58579 16.625 10C16.625 10.4142 16.2892 10.75 15.875 10.75z" fill="currentColor"></path><path d="M17.375 14.75L11.375 14.75C10.9608 14.75 10.625 14.4142 10.625 14C10.625 13.5858 10.9608 13.25 11.375 13.25L17.375 13.25C17.7892 13.25 18.125 13.5858 18.125 14C18.125 14.4142 17.7892 14.75 17.375 14.75z" fill="currentColor"></path><path d="M7.875 10C7.875 10.4142 7.53921 10.75 7.125 10.75L6.625 10.75C6.21079 10.75 5.875 10.4142 5.875 10C5.875 9.58579 6.21079 9.25 6.625 9.25L7.125 9.25C7.53921 9.25 7.875 9.58579 7.875 10z" fill="currentColor"></path><path d="M9.375 14C9.375 14.4142 9.03921 14.75 8.625 14.75L8.125 14.75C7.71079 14.75 7.375 14.4142 7.375 14C7.375 13.5858 7.71079 13.25 8.125 13.25L8.625 13.25C9.03921 13.25 9.375 13.5858 9.375 14z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">374</span></span></div><span class="bili-video-card__stats__duration">01:59</span></div></div></div></a><div style="" class="bili-video-card__info"><div class="bili-video-card__info--right"><!--[--><div class="bili-video-card__info--no-interest" style="display:none;"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="bili-video-card__info--no-interest--icon" fill="currentColor"><!--[--><path d="M13.62335 5.49835C13.62335 6.3949 12.8966 7.12171 12 7.12171C11.10345 7.12171 10.37665 6.3949 10.37665 5.49835C10.37665 4.6018 11.10345 3.875 12 3.875C12.8966 3.875 13.62335 4.6018 13.62335 5.49835zM13.62345 18.4985C13.62345 19.3951 12.8966 20.12195 12 20.12195C11.10335 20.Line truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-339aeb28=""><!--]--><!--]--></picture><div class="v-inline-player"></div></div><div class="bili-video-card__mask"><div class="bili-video-card__stats"><div class="bili-video-card__stats--left"><!--[--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M14.7138 10.96875C15.50765 11.4271 15.50765 12.573 14.71375 13.0313L11.5362 14.8659C10.74235 15.3242 9.75 14.7513 9.75001 13.8346L9.75001 10.1655C9.75001 9.24881 10.74235 8.67587 11.5362 9.13422L14.7138 10.96875z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">150.1万</span></span><!--]--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M15.875 10.75L9.875 10.75C9.46079 10.75 9.125 10.4142 9.125 10C9.125 9.58579 9.46079 9.25 9.875 9.25L15.875 9.25C16.2892 9.25 16.625 9.58579 16.625 10C16.625 10.4142 16.2892 10.75 15.875 10.75z" fill="currentColor"></path><path d="M17.375 14.75L11.375 14.75C10.9608 14.75 10.625 14.4142 10.625 14C10.625 13.5858 10.9608 13.25 11.375 13.25L17.375 13.25C17.7892 13.25 18.125 13.5858 18.125 14C18.125 14.4142 17.7892 14.75 17.375 14.75z" fill="currentColor"></path><path d="M7.875 10C7.875 10.4142 7.53921 10.75 7.125 10.75L6.625 10.75C6.21079 10.75 5.875 10.4142 5.875 10C5.875 9.58579 6.21079 9.25 6.625 9.25L7.125 9.25C7.53921 9.25 7.875 9.58579 7.875 10z" fill="currentColor"></path><path d="M9.375 14C9.375 14.4142 9.03921 14.75 8.625 14.75L8.125 14.75C7.71079 14.75 7.375 14.4142 7.375 14C7.375 13.5858 7.71079 13.25 8.125 13.25L8.625 13.25C9.03921 13.25 9.375 13.5858 9.375 14z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">1.0万</span></span></div><span class="bili-video-card__stats__duration">11:03</span></div></div></div></a><div style="" class="bili-video-card__info"><div class="bili-video-card__info--right"><!--[--><div class="bili-video-card__info--no-interest" style="display:none;"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="bili-video-card__info--no-interest--icon" fill="currentColor"><!--[--><path d="M13.62335 5.49835C13.62335 6.3949 12.8966 7.12171 12 7.12171C11.10345 7.12171 10.37665 6.3949 10.37665 5.49835C10.37665 4.6018 11.10345 3.875 12 3.875C12.8966 3.875 13.62335 4.6018 13.62335 5.49835zM13.62345 18.4985C13.62345 19.3951 12.8966 20.12195 12 20.12195C11.10335Line truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-339aeb28=""><!--]--><!--]--></picture><div class="v-inline-player"></div></div><div class="bili-video-card__mask"><div class="bili-video-card__stats"><div class="bili-video-card__stats--left"><!--[--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M14.7138 10.96875C15.50765 11.4271 15.50765 12.573 14.71375 13.0313L11.5362 14.8659C10.74235 15.3242 9.75 14.7513 9.75001 13.8346L9.75001 10.1655C9.75001 9.24881 10.74235 8.67587 11.5362 9.13422L14.7138 10.96875z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">126.3万</span></span><!--]--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M15.875 10.75L9.875 10.75C9.46079 10.75 9.125 10.4142 9.125 10C9.125 9.58579 9.46079 9.25 9.875 9.25L15.875 9.25C16.2892 9.25 16.625 9.58579 16.625 10C16.625 10.4142 16.2892 10.75 15.875 10.75z" fill="currentColor"></path><path d="M17.375 14.75L11.375 14.75C10.9608 14.75 10.625 14.4142 10.625 14C10.625 13.5858 10.9608 13.25 11.375 13.25L17.375 13.25C17.7892 13.25 18.125 13.5858 18.125 14C18.125 14.4142 17.7892 14.75 17.375 14.75z" fill="currentColor"></path><path d="M7.875 10C7.875 10.4142 7.53921 10.75 7.125 10.75L6.625 10.75C6.21079 10.75 5.875 10.4142 5.875 10C5.875 9.58579 6.21079 9.25 6.625 9.25L7.125 9.25C7.53921 9.25 7.875 9.58579 7.875 10z" fill="currentColor"></path><path d="M9.375 14C9.375 14.4142 9.03921 14.75 8.625 14.75L8.125 14.75C7.71079 14.75 7.375 14.4142 7.375 14C7.375 13.5858 7.71079 13.25 8.125 13.25L8.625 13.25C9.03921 13.25 9.375 13.5858 9.375 14z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">4442</span></span></div><span class="bili-video-card__stats__duration">29:57</span></div></div></div></a><div style="" class="bili-video-card__info"><div class="bili-video-card__info--right"><!--[--><div class="bili-video-card__info--no-interest" style="display:none;"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="bili-video-card__info--no-interest--icon" fill="currentColor"><!--[--><path d="M13.62335 5.49835C13.62335 6.3949 12.8966 7.12171 12 7.12171C11.10345 7.12171 10.37665 6.3949 10.37665 5.49835C10.37665 4.6018 11.10345 3.875 12 3.875C12.8966 3.875 13.62335 4.6018 13.62335 5.49835zM13.62345 18.4985C13.62345 19.3951 12.8966 20.12195 12 20.12195C11.10335 2Line truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-339aeb28=""><!--]--><!--]--></picture><div class="v-inline-player"></div></div><div class="bili-video-card__mask"><div class="bili-video-card__stats"><div class="bili-video-card__stats--left"><!--[--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M14.7138 10.96875C15.50765 11.4271 15.50765 12.573 14.71375 13.0313L11.5362 14.8659C10.74235 15.3242 9.75 14.7513 9.75001 13.8346L9.75001 10.1655C9.75001 9.24881 10.74235 8.67587 11.5362 9.13422L14.7138 10.96875z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">6.7万</span></span><!--]--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M15.875 10.75L9.875 10.75C9.46079 10.75 9.125 10.4142 9.125 10C9.125 9.58579 9.46079 9.25 9.875 9.25L15.875 9.25C16.2892 9.25 16.625 9.58579 16.625 10C16.625 10.4142 16.2892 10.75 15.875 10.75z" fill="currentColor"></path><path d="M17.375 14.75L11.375 14.75C10.9608 14.75 10.625 14.4142 10.625 14C10.625 13.5858 10.9608 13.25 11.375 13.25L17.375 13.25C17.7892 13.25 18.125 13.5858 18.125 14C18.125 14.4142 17.7892 14.75 17.375 14.75z" fill="currentColor"></path><path d="M7.875 10C7.875 10.4142 7.53921 10.75 7.125 10.75L6.625 10.75C6.21079 10.75 5.875 10.4142 5.875 10C5.875 9.58579 6.21079 9.25 6.625 9.25L7.125 9.25C7.53921 9.25 7.875 9.58579 7.875 10z" fill="currentColor"></path><path d="M9.375 14C9.375 14.4142 9.03921 14.75 8.625 14.75L8.125 14.75C7.71079 14.75 7.375 14.4142 7.375 14C7.375 13.5858 7.71079 13.25 8.125 13.25L8.625 13.25C9.03921 13.25 9.375 13.5858 9.375 14z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">5556</span></span></div><span class="bili-video-card__stats__duration">37:58</span></div></div></div></a><div style="" class="bili-video-card__info"><div class="bili-video-card__info--right"><!--[--><div class="bili-video-card__info--no-interest" style="display:none;"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="bili-video-card__info--no-interest--icon" fill="currentColor"><!--[--><path d="M13.62335 5.49835C13.62335 6.3949 12.8966 7.12171 12 7.12171C11.10345 7.12171 10.37665 6.3949 10.37665 5.49835C10.37665 4.6018 11.10345 3.875 12 3.875C12.8966 3.875 13.62335 4.6018 13.62335 5.49835zM13.62345 18.4985C13.62345 19.3951 12.8966 20.12195 12 20.12195C11.10335 20.Line truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
" data-v-339aeb28=""><!--]--><!--]--></picture><div class="v-inline-player"></div></div><div class="bili-video-card__mask"><div class="bili-video-card__stats"><div class="bili-video-card__stats--left"><!--[--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M14.7138 10.96875C15.50765 11.4271 15.50765 12.573 14.71375 13.0313L11.5362 14.8659C10.74235 15.3242 9.75 14.7513 9.75001 13.8346L9.75001 10.1655C9.75001 9.24881 10.74235 8.67587 11.5362 9.13422L14.7138 10.96875z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">50.8万</span></span><!--]--><span class="bili-video-card__stats--item"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" class="bili-video-card__stats--icon"><!--[--><path d="M12 4.99805C9.48178 4.99805 7.283 5.12616 5.73089 5.25202C4.65221 5.33949 3.81611 6.16352 3.72 7.23254C3.60607 8.4998 3.5 10.171 3.5 11.998C3.5 13.8251 3.60607 15.4963 3.72 16.76355C3.81611 17.83255 4.65221 18.6566 5.73089 18.7441C7.283 18.8699 9.48178 18.998 12 18.998C14.5185 18.998 16.7174 18.8699 18.2696 18.74405C19.3481 18.65655 20.184 17.8328 20.2801 16.76405C20.394 15.4973 20.5 13.82645 20.5 11.998C20.5 10.16965 20.394 8.49877 20.2801 7.23205C20.184 6.1633 19.3481 5.33952 18.2696 5.25205C16.7174 5.12618 14.5185 4.99805 12 4.99805zM5.60965 3.75693C7.19232 3.62859 9.43258 3.49805 12 3.49805C14.5677 3.49805 16.8081 3.62861 18.3908 3.75696C20.1881 3.90272 21.6118 5.29278 21.7741 7.09773C21.8909 8.3969 22 10.11405 22 11.998C22 13.88205 21.8909 15.5992 21.7741 16.8984C21.6118 18.7033 20.1881 20.09335 18.3908 20.23915C16.8081 20.3675 14.5677 20.498 12 20.498C9.43258 20.498 7.19232 20.3675 5.60965 20.2392C3.81206 20.0934 2.38831 18.70295 2.22603 16.8979C2.10918 15.5982 2 13.8808 2 11.998C2 10.1153 2.10918 8.39787 2.22603 7.09823C2.38831 5.29312 3.81206 3.90269 5.60965 3.75693z" fill="currentColor"></path><path d="M15.875 10.75L9.875 10.75C9.46079 10.75 9.125 10.4142 9.125 10C9.125 9.58579 9.46079 9.25 9.875 9.25L15.875 9.25C16.2892 9.25 16.625 9.58579 16.625 10C16.625 10.4142 16.2892 10.75 15.875 10.75z" fill="currentColor"></path><path d="M17.375 14.75L11.375 14.75C10.9608 14.75 10.625 14.4142 10.625 14C10.625 13.5858 10.9608 13.25 11.375 13.25L17.375 13.25C17.7892 13.25 18.125 13.5858 18.125 14C18.125 14.4142 17.7892 14.75 17.375 14.75z" fill="currentColor"></path><path d="M7.875 10C7.875 10.4142 7.53921 10.75 7.125 10.75L6.625 10.75C6.21079 10.75 5.875 10.4142 5.875 10C5.875 9.58579 6.21079 9.25 6.625 9.25L7.125 9.25C7.53921 9.25 7.875 9.58579 7.875 10z" fill="currentColor"></path><path d="M9.375 14C9.375 14.4142 9.03921 14.75 8.625 14.75L8.125 14.75C7.71079 14.75 7.375 14.4142 7.375 14C7.375 13.5858 7.71079 13.25 8.125 13.25L8.625 13.25C9.03921 13.25 9.375 13.5858 9.375 14z" fill="currentColor"></path><!--]--></svg><span class="bili-video-card__stats--text">162</span></span></div><span class="bili-video-card__stats__duration">03:11</span></div></div></div></a><div style="" class="bili-video-card__info"><div class="bili-video-card__info--right"><!--[--><div class="bili-video-card__info--no-interest" style="display:none;"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="bili-video-card__info--no-interest--icon" fill="currentColor"><!--[--><path d="M13.62335 5.49835C13.62335 6.3949 12.8966 7.12171 12 7.12171C11.10345 7.12171 10.37665 6.3949 10.37665 5.49835C10.37665 4.6018 11.10345 3.875 12 3.875C12.8966 3.875 13.62335 4.6018 13.62335 5.49835zM13.62345 18.4985C13.62345 19.3951 12.8966 20.12195 12 20.12195C11.10335 20.Line truncated
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
"></picture><div data-v-315489fe="" class="detail-button">查看详情</div></div><!----><!----></div><div data-v-f5eb2b98="" class="watchlater-pip-button" data-watchlater-pip-entry="true"><div data-v-f5eb2b98="" class="watchlater-pip-button-inner-wrap"><div data-v-f5eb2b98="" class="watchlater-pip-button-inner expand-btn"><div data-v-f5eb2b98="" class="btn-icon"><svg data-v-f5eb2b98="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="btn-icon-inner svg-icon" fill="currentColor"><path d="M12 3.99976C7.58172 3.99976 4 7.58148 4 11.9998C4 16.418 7.58172 19.9998 12 19.9998C14.209 19.9998 16.2072 19.1058 17.656 17.6575C18.0465 17.2671 18.6797 17.2672 19.0702 17.6577C19.4606 18.0483 19.4605 18.6815 19.0699 19.072C17.2615 20.8798 14.7606 21.9998 12 21.9998C6.47715 21.9998 2 17.5226 2 11.9998C2 6.47691 6.47715 1.99976 12 1.99976C17.5228 1.99976 22 6.47691 22 11.9998C22 12.3745 21.9793 12.7449 21.939 13.1096C21.8783 13.6586 21.3841 14.0544 20.8352 13.9937C20.2863 13.933 19.8904 13.4388 19.9511 12.8899C19.9834 12.598 20 12.301 20 11.9998C20 7.58148 16.4183 3.99976 12 3.99976z" fill="currentColor"></path><path d="M18.2929 10.7926C18.6834 10.4021 19.3166 10.4021 19.7071 10.7926L21 12.0855L22.2929 10.7926C22.6834 10.4021 23.3166 10.4021 23.7071 10.7926C24.0976 11.1832 24.0976 11.8163 23.7071 12.2069L21.8839 14.0301C21.3957 14.5182 20.6043 14.5182 20.1161 14.0301L18.2929 12.2069C17.9024 11.8163 17.9024 11.1832 18.2929 10.7926z" fill="currentColor"></path><path d="M15.1659 11.0861C15.8694 11.4922 15.8694 12.5077 15.1659 12.9138L11.207 15.1995C10.5035 15.6056 9.62413 15.0979 9.62413 14.2856L9.62413 9.71432C9.62413 8.90197 10.5035 8.39425 11.207 8.80042L15.1659 11.0861z" fill="currentColor"></path></svg><picture data-v-339aeb28="" data-v-f5eb2b98="" class="v-img btn-icon-inner png-icon"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/static/jinkela/long/images/wlpip-playing-active.gif@48w_48h.avif" type="image/avif"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/static/jinkela/long/images/wlpip-playing-active.gif@48w_48h.webp" type="image/webp"><img data-v-339aeb28="" src="//i1.hdslb.com/bfs/static/jinkela/long/images/wlpip-playing-active.gif@48w_48h" alt="" loading="lazy" onload="" onerror="
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
"></picture></div><div data-v-f5eb2b98="" class="btn-tips" style="display: none;">0</div></div><div data-v-f5eb2b98="" class="entry-toast" style=""><div data-v-f5eb2b98="" class="close"><svg data-v-f5eb2b98="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 12 12" width="12" height="12" fill="currentColor"><path d="M2.021815 2.0232C2.4123549999999985 1.632674999999999 3.0455000000000014 1.632674999999999 3.4360199999999987 2.0232L5.9992 4.586399999999999L8.56315 2.02238C8.953700000000003 1.631854999999999 9.586899999999996 1.631854999999999 9.977349999999996 2.02238C10.368050000000004 2.4129000000000014 10.368050000000004 3.0460649999999996 9.977349999999996 3.4365849999999987L7.4134 6.0006L9.976700000000005 8.564000000000004C10.367400000000004 8.954450000000003 10.367400000000004 9.587649999999996 9.976700000000005 9.978099999999996C9.586249999999996 10.36865 8.953049999999996 10.36865 8.5625 9.978099999999996L5.9992 7.4148000000000005L3.43669 9.9774C3.0461450000000014 10.36785 2.4130050000000005 10.36785 2.02246 9.9774C1.6319399999999988 9.5867 1.6319399999999988 8.953650000000003 2.02246 8.563200000000004L4.584999999999999 6.0006L2.021815 3.4374049999999987C1.6312900000000008 3.0468849999999996 1.6312900000000008 2.4137200000000014 2.021815 2.0232z" fill="currentColor"></path></svg></div><div data-v-f5eb2b98="" class="text">点击视频卡片右上角添加!</div></div></div></div><div data-v-4f27ff84="" class="flexible-roll-btn hidden"><div data-v-4f27ff84="" class="flexible-roll-btn-inner"><svg data-v-4f27ff84="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="btn-icon" fill="currentColor"><path d="M12 4.5C7.85786 4.5 4.5 7.85786 4.5 12C4.5 16.1421 7.85786 19.5 12 19.5C14.0667 19.5 15.9365 18.6654 17.2941 17.3125C17.6853 16.9226 18.3185 16.9237 18.7083 17.3149C19.0982 17.7061 19.0971 18.3393 18.7059 18.7291C16.9887 20.4404 14.6172 21.5 12 21.5C6.75329 21.5 2.5 17.2467 2.5 12C2.5 6.75329 6.75329 2.5 12 2.5C17.2467 2.5 21.5 6.75329 21.5 12C21.5 12.356 21.4804 12.7078 21.4421 13.0543C21.3814 13.6033 20.8872 13.9991 20.3382 13.9384C19.7893 13.8777 19.3935 13.3835 19.4542 12.8346C19.4844 12.5609 19.5 12.2825 19.5 12C19.5 7.85786 16.1421 4.5 12 4.5z" fill="currentColor"></path><path d="M17.2929 10.7929C17.6834 10.4024 18.3166 10.4024 18.7071 10.7929L20.5 12.5858L22.2929 10.7929C22.6834 10.4024 23.3166 10.4024 23.7071 10.7929C24.0976 11.1834 24.0976 11.8166 23.7071 12.2071L21.3839 14.5303C20.8957 15.0185 20.1043 15.0185 19.6161 14.5303L17.2929 12.2071C16.9024 11.8166 16.9024 11.1834 17.2929 10.7929z" fill="currentColor"></path></svg><div data-v-4f27ff84="" class="btn-text"><span data-v-4f27ff84="" class="btn-text-inner">刷新内容</span></div></div></div><div data-v-4f27ff84="" class="storage-box hidden"><div data-v-4f27ff84="" class="storable-items" style="display: none;"><a data-v-4f27ff84="" target="_blank" href="https://www.bilibili.com/blackboard/activity-xKR6yNjuJ6.html" class="primary-btn feedback"> 新版反馈 </a><a data-v-4f27ff84="" target="_blank" href="https://www.bilibili.com/v/customer-service" class="primary-btn"><svg data-v-4f27ff84="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" fill="currentColor"><path d="M3.75 10.5C3.75 5.94365 7.44365 2.25 12 2.25C16.55635 2.25 20.25 5.94365 20.25 10.5C20.25 10.9142 19.9142 11.25 19.5 11.25C19.0858 11.25 18.75 10.9142 18.75 10.5C18.75 6.77208 15.72795 3.75 12 3.75C8.27208 3.75 5.25 6.77208 5.25 10.5C5.25 10.9142 4.91421 11.25 4.5 11.25C4.08579 11.25 3.75 10.9142 3.75 10.5z" fill="currentColor"></path><path d="M19.7837 16.27445C20.16715 16.43115 20.35095 16.869 20.19425 17.25245C19.4912 18.97275 17.94805 20.08875 16.53735 20.76425C15.13135 21.43745 13.69515 21.74995 13 21.74995C12.5858 21.74995 12.25 21.41415 12.25 20.99995C12.25 20.5857 12.5858 20.24995 13 20.24995C13.40985 20.24995 14.6224 20.0181 15.88955 19.4113C17.15195 18.8068 18.3063 17.9072 18.80575 16.685C18.9624 16.30155 19.4003 16.11775 19.7837 16.27445z" fill="currentColor"></path><path d="M10.25 21C10.25 20.3787 10.7537 19.875 11.375 19.875L12.625 19.875C13.2463 19.875 13.75 20.3787 13.75 21C13.75 21.6213 13.2463 22.125 12.625 22.125L11.375 22.125C10.7537 22.125 10.25 21.6213 10.25 21z" fill="currentColor"></path><path d="M2 12.75C2 11.2312 3.23122 10 4.75 10L5.5 10C6.60457 10 7.5 10.89545 7.5 12L7.5 15.5C7.5 16.60455 6.60457 17.5 5.5 17.5L4.75 17.5C3.23122 17.5 2 16.2688 2 14.75L2 12.75zM4.75 11.5C4.05965 11.5 3.5 12.05965 3.5 12.75L3.5 14.75C3.5 15.44035 4.05965 16 4.75 16L5.5 16C5.77614 16 6 15.77615 6 15.5L6 12C6 11.72385 5.77614 11.5 5.5 11.5L4.75 11.5z" fill="currentColor"></path><path d="M16.5 12C16.5 10.89545 17.39545 10 18.5 10L19.25 10C20.7688 10 22 11.2312 22 12.75L22 14.75C22 16.2688 20.7688 17.5 19.25 17.5L18.5 17.5C17.39545 17.5 16.5 16.60455 16.5 15.5L16.5 12zM18.5 11.Line truncated
<script type="text/javascript">window.__pinia=(function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,_,$,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an,ao,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aI,aJ,aK,aL,aM,aN,aO,aP,aQ,aR,aS,aT,aU,aV,aW,aX,aY,aZ,a_,a$,ba,bb,bc,bd,be,bf,bg,bh,bi,bj,bk,bl,bm,bn,bo,bp,bq,br,bs,bt,bu,bv,bw,bx,by,bz,bA,bB,bC,bD,bE,bF,bG,bH,bI,bJ,bK,bL,bM,bN,bO,bP,bQ,bR,bS,bT,bU,bV,bW,bX,bY,bZ,b_,b$,ca,cb,cc,cd,ce,cf,cg,ch,ci,cj,ck,cl,cm,cn,co,cp,cq,cr,cs,ct,cu){M.freshIdx=a;M.id=m;M.reportId="av_n_116752243492511";N.freshIdx=a;N.id=n;N.reportId="av_n_116753233348410";O.freshIdx=a;O.id=o;O.reportId="av_n_116748552570821";P.freshIdx=a;P.id=p;P.reportId="av_n_116748552508416";Q.freshIdx=a;Q.id=q;Q.reportId="av_n_116741472525660";R.freshIdx=a;R.id=r;R.reportId="av_n_116755330503886";S.freshIdx=a;S.id=s;S.reportId="av_n_116752293891019";T.freshIdx=a;T.id=t;T.reportId="av_n_116747294214059";U.freshIdx=a;U.id=u;U.reportId="av_n_116763031246456";V.freshIdx=a;V.id=v;V.reportId="av_n_116752377716135";return {index:{theme:"light",bmgDefDomain:b,homeVersion:L,smallest:d,xs_sm:d,xs:d,sm:d,md:d,lg:d,xl:d,xxl:d,headerBannerData:{id:371,style:a,rid:a,name:b,litpic:"http:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Farchive\u002F87a5d03581e326f4f818cab3212ce471d1f6a064.png",pic:"http:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Farchive\u002Fcc634ec77d2755641d5ed3f392c9b7e065a88aae.png",url:b,is_split_layer:e,split_layer:"{\"version\":\"1\",\"layers\":[{\"resources\":[{\"src\":\"https:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Fvc\u002F7ba90052bb0a7d52ff2e2651c58325176823dab7.png\",\"id\":0}],\"scale\":{\"initial\":0.45},\"rotate\":{},\"translate\":{},\"blur\":{},\"opacity\":{\"wrap\":\"clamp\"},\"id\":0,\"name\":\"033bg\"},{\"resources\":[{\"src\":\"https:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Fvc\u002F345b6e0fe3bcce70b4dda85984e6bd2e989ed383.png\",\"id\":0}],\"scale\":{\"initial\":0.45},\"rotate\":{},\"translate\":{\"offset\":[10,0]},\"blur\":{},\"opacity\":{\"wrap\":\"clamp\"},\"id\":1,\"name\":\"032云层\"},{\"resources\":[{\"src\":\"https:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Fvc\u002F943d6df51d9698d2bbccfd1420a91e42c0bdb8ce.png\",\"id\":0}],\"scale\":{\"initial\":0.45},\"rotate\":{},\"translate\":{\"offset\":[12,0]},\"blur\":{},\"opacity\":{\"wrap\":\"clamp\"},\"id\":3,\"name\":\"030右边电线\"},{\"resources\":[{\"src\":\"https:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Fvc\u002F7df8b2e7038b224ce684694d05e55ac537534f97.png\",\"id\":0}],\"scale\":{\"initial\":0.45},\"rotate\":{},\"translate\":{\"offset\":[10,5]},\"blur\":{},\"opacity\":{\"wrap\":\"clamp\"},\"id\":4,\"name\":\"029山\"},{\"resources\":[{\"src\":\"https:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Fvc\u002Fd3a3efde2411a0a79421ca9e7a7fa5ffa6a377e8.png\",\"id\":0}],\"scale\":{\"initial\":0.45},\"rotate\":{},\"translate\":{\"offset\":[14,0]},\"blur\":{},\"opacity\":{\"wrap\":\"clamp\"},\"id\":6,\"name\":\"027右边树丛\"},{\"resources\":[{\"src\":\"https:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Fvc\u002Fd6f0810cff9d297fb5de5dcd474b1303cc8efc56.png\",\"id\":0}],\"scale\":{\"initial\":0.45},\"rotate\":{},\"translate\":{\"offset\":[16,0]},\"blur\":{},\"opacity\":{\"wrap\":\"clamp\"},\"id\":7,\"name\":\"026水塘\"},{\"resources\":[{\"src\":\"https:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Fvc\u002Fe3442b0c6d5b098a0577ae9a52fe3f862e253457.png\",\"id\":0}],\"scale\":{\"initial\":0.45},\"rotate\":{},\"translate\":{\"offset\":[12,2]},\"blur\":{},\"opacity\":{\"wrap\":\"clamp\"},\"id\":8,\"name\":\"025尾巴\"},{\"resources\":[{\"src\":\"https:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Fvc\u002Fb45d1213022a666a43a8a826a05ba449ca14f5ae.png\",\"id\":0}],\"scale\":{\"initial\":0.45},\"rotate\":{},\"translate\":{\"offset\":[13,2]},\"blur\":{},\"opacity\":{\"wrap\":\"clamp\"},\"id\":9,\"name\":\"024二节\"},{\"resources\":[{\"src\":\"https:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Fvc\u002Ffe1d49a21d9715906fd580a09f5dab5a4d8762b9.png\",\"id\":0}],\"scale\":{\"initial\":0.45},\"rotate\":{},\"translate\":{\"offset\":[10,2]},\"blur\":{},\"opacity\":{\"wrap\":\"clamp\"},\"id\":10,\"name\":\"023一节\"},{\"resources\":[{\"src\":\"https:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Fvc\u002Faaed1e390b9cd7a7cf04da45cae135856b66df8f.png\",\"id\":0}],\"scale\":{\"initial\":0.45},\"rotate\":{},\"translate\":{\"offset\":[10,0]},\"blur\":{},\"opacity\":{\"wrap\":\"clamp\"},\"id\":11,\"name\":\"022石头\"},{\"resources\":[{\"src\":\"https:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Fvc\u002F2b343db84d1754f9ad69a761d1a0043be367b134.png\",\"id\":0}],\"scale\":{\"initial\":0.45},\"rotate\":{},\"translate\":{\"offset\":[8,2]},\"blur\":{},\"opacity\":{\"wrap\":\"clamp\"},\"id\":12,\"name\":\"021尾巴\"},{\"resources\":[{\"src\":\"https:\u002F\u002Fi0.hdslb.com\u002Fbfs\u002Fvc\u002F3a951ea0bd0b2d1c7972f06fd087efdeef037094.png\",\"id\":0}],\"scale\":{\"initial\":0.45},\"rotate\":{},\"translate\":{\"offset\":[10,2]},\"blur\":{},\"opacity\":{\"wrap\":\Line truncated
<script data-inject-polyfill="" src="https://www.bilibili.com/gentleman/polyfill.js?features=es2015%2Ces2016%2Ces2017%2Ces2018%2Ces2019%2Ces2020%2Ces2021%2Ces2022%2CglobalThis&amp;flags=gated"></script>
<script type="module" crossorigin="" src="//s1.hdslb.com/bfs/static/shanks/laputa-home/assets/index-ad80b630.js"></script>
<script type="text/javascript" src="//s1.hdslb.com/bfs/cm/cm-sdk/static/js/bili-collect.js"></script>
<script nomodule="">!function(){var e=document,t=e.createElement("script");if(!("noModule"in t)&&"onbeforeload"in t){var n=!1;e.addEventListener("beforeload",(function(e){if(e.target===t)n=!0;else if(!e.target.hasAttribute("nomodule")||!n)return;e.preventDefault()}),!0),t.type="module",t.src=".",e.head.appendChild(t),t.remove()}}();</script>
<script nomodule="" crossorigin="" id="vite-legacy-polyfill" src="//s1.hdslb.com/bfs/static/shanks/laputa-home/assets/polyfills-legacy-aeac6404.js"></script>
<script nomodule="" crossorigin="" id="vite-legacy-entry" data-src="//s1.hdslb.com/bfs/static/shanks/laputa-home/assets/index-legacy-3dbe9f71.js">System.import(document.getElementById('vite-legacy-entry').getAttribute('data-src'))</script>
<iframe id="DpbJcIT8jx" src="https://s1.hdslb.com/bfs/seed/jinkela/short/leader-election/iframe.html?leaderID=watchlaterpipwindow" style="display: none;"></iframe><iframe src="https://s1.hdslb.com/bfs/seed/jinkela/short/cols/iframe.html" style="display: none;" data-count="2" data-loaded="true"></iframe><div data-v-315489fe="" class="adcard"><div data-v-315489fe="" class="fixed-card-inner"><div data-v-315489fe="" class="palette-button-adcard is-bottom translucent" style="left: 660px;"><picture data-v-339aeb28="" data-v-315489fe="" class="v-img ad-img"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/activity-plat/static/20260615/e8d40a4dbad57d5373ac76d80151a459/0XTDmwYVBT.png@800w_512h.avif" type="image/avif"><source data-v-339aeb28="" srcset="//i1.hdslb.com/bfs/activity-plat/static/20260615/e8d40a4dbad57d5373ac76d80151a459/0XTDmwYVBT.png@800w_512h.webp" type="image/webp"><img data-v-339aeb28="" src="//i1.hdslb.com/bfs/activity-plat/static/20260615/e8d40a4dbad57d5373ac76d80151a459/0XTDmwYVBT.png@800w_512h" alt="card" loading="eager" onload="" onerror="
typeof window.imgOnError === 'function' &amp;&amp; window.imgOnError(this)
"></picture><svg data-v-315489fe="" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24" width="24" height="24" class="exit-icon" fill="currentColor"><path d="M4.75075 4.75352C5.14127 4.36299 5.77444 4.36299 6.16496 4.75352L11.9984 10.587L17.8335 4.75188C18.224 4.36135 18.8572 4.36135 19.2477 4.75188C19.6383 5.1424 19.6383 5.77557 19.2477 6.16609L13.4126 12.0012L19.2464 17.835C19.637 18.2255 19.637 18.8587 19.2464 19.2492C18.8559 19.6397 18.2227 19.6397 17.8322 19.2492L11.9984 13.4154L6.16626 19.2476C5.77573 19.6381 5.14257 19.6381 4.75204 19.2476C4.36152 18.857 4.36152 18.2239 4.75204 17.8334L10.5842 12.0012L4.75075 6.16773C4.36022 5.77721 4.36022 5.14404 4.75075 4.75352z" fill="currentColor"></path></svg><div data-v-315489fe="" class="detail-button"> 查看详情 </div></div></div></div><script crossorigin="anonymous" type="text/javascript" src="//s1.hdslb.com/bfs/seed/jinkela/short/minntaki-wasm-sdk/bili-sc-sdk.umd.js"></script></body></html>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+7
View File
@@ -38,12 +38,19 @@ def _build_llm_for_agent(cfg: AgentConfig):
break
if model_config:
# enable_thinking: true 时传入空 extra_body 恢复模型原生行为(启用思考)
# 默认不传 extra_body,由 ChatQwen 使用禁用思考的默认值
if model_config.get("enable_thinking"):
extra_body = {}
else:
extra_body = None
return ChatQwen(
model=model_config.get("model", ""),
api_key=model_config.get("api_key", ""),
base_url=model_config.get("base_url", ""),
timeout=float(model_config.get("timeout", 60)),
max_retries=int(model_config.get("max_retries", 0)),
extra_body=extra_body,
)
# 回退:使用环境变量中已加载的默认 LLM 配置
from agent.core.llm import llm as _default_llm
+3
View File
@@ -0,0 +1,3 @@
import pyautogui
pyautogui.displayMousePosition()
+1 -1
View File
@@ -10,7 +10,7 @@ from agent.agents.agent import (
from agent.core.runtime import continue_after_human_action as continue_runtime_after_human_action
from agent.core.runtime import execute_agent as execute_runtime_agent
AgentMode = Literal["agent", "team"]
AgentMode = Literal["agent", "team", "plan"]
# 首次导入时从配置构建主 Agent 运行时并缓存引用
_built = build_all_agent_runtimes()
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+4 -2
View File
@@ -1,12 +1,14 @@
[
{
"name": "main",
"system_prompt": "你是一个多模态助手,能够直接理解用户上传的图片、语音等内容。\n 【关键行为准则】\n - 你的默认行为是优先调用gui工具解决用户问题。\n - 只有当某个信息是你**绝对无法从当前对话或上传内容中获取**,且该信息必须通过外部工具才能获得时,才允许调用工具。\n - 对于任何图片/音频输入,请始终**直接**利用你的视觉/听觉能力回答,**绝对不要**调用截图、OCR、日期查询等无关工具。\n - 如果你不确定是否需要工具,选择**不调用**,直接给出你能给出的最佳答案。\n - 违反上述规则是一种严重错误。",
"system_prompt": "你是一个多模态助手,能够直接理解用户上传的图片、语音等内容。\n 【关键行为准则】\n - 你的默认行为是优先调用工具解决用户问题。\n - 只有当某个信息是你**绝对无法从当前对话或上传内容中获取**,且该信息必须通过外部工具才能获得时,才允许调用工具。\n - 对于任何图片/音频输入,请始终**直接**利用你的视觉/听觉能力回答,**绝对不要**调用截图、OCR、日期查询等无关工具。\n - 如果你不确定是否需要工具,选择**不调用**,直接给出你能给出的最佳答案。\n - 违反上述规则是一种严重错误。",
"max_iterations": 200,
"llm_model_id": "affiaa7r",
"tools": [
"gui_tool",
"browser_control"
"browser_control",
"human_interaction",
"todo_list"
],
"enabled": true,
"role": "main",
+2 -2
View File
@@ -305,8 +305,8 @@ def _default_env_config() -> dict:
"IMG_SIZE": "768",
"RAG_CHUNK_SIZE": "500",
"RAG_CHUNK_OVERLAP": "50",
"GROUNDING_WIDTH": "1000",
"GROUNDING_HEIGHT": "1000",
"GROUNDING_WIDTH": "1024",
"GROUNDING_HEIGHT": "576",
}
+1 -1
View File
@@ -82,7 +82,7 @@ GRAPH_REGISTRY: dict[str, dict[str, Any]] = {
"react": {
"builder": build_agent_graph,
"display_name": "ReAct (标准)",
"description": "标准 ReAct 循环:agent 推理 -> 工具执行 -> 结果处理 -> agent 继续推理,直至完成。适用于绝大多数单 Agent 场景。",
"description": "标准 ReAct 循环:agent 推理 -> 工具执行 -> 结果处理 -> agent 继续推理,直至完成。Plan 模式通过 agent_mode 参数控制(首次强制生成 todolist,后续每步注入反思提示),无需单独图。",
},
}
+14 -3
View File
@@ -72,15 +72,26 @@ class ChatQwen(ChatOpenAI):
可扩展性:
可增加 default_headers、proxy 等 ChatOpenAI 参数。
"""
# 允许调用方覆盖 extra_body:
# - None(默认):使用禁用思考的默认值
# - 空 dict {}:清空 extra_body,恢复模型原生行为(含思考模式)
# - 非空 dict:直接使用传入值
custom_extra_body = kwargs.pop("extra_body", None)
if custom_extra_body is None:
extra_body = {
"chat_template_kwargs": {"enable_thinking": False},
"thinking": {"type": "disabled"},
}
else:
extra_body = custom_extra_body
super().__init__(
model=kwargs.pop("model", os.environ.get("LLM_MODEL", "")),
api_key=kwargs.pop("api_key", os.environ.get("LLM_API_KEY", "")),
base_url=kwargs.pop("base_url", os.environ.get("LLM_BASE_URL", "")),
timeout=kwargs.pop("timeout", float(os.environ.get("LLM_TIMEOUT", 60))),
max_retries=kwargs.pop("max_retries", 0),
extra_body={
"chat_template_kwargs": {"enable_thinking": False}
},
extra_body=extra_body,
**kwargs
)
+146 -6
View File
@@ -1,20 +1,27 @@
"""LangGraph 图节点:模型调用与工具产物后处理。
"""LangGraph 图节点:模型调用、反思机制与工具产物后处理。
系统定位:
实现 ReAct 循环中的 ``agent`` 节点工厂与 ``process_tool_artifact`` 节点,
被 ``graph`` 注册到 StateGraph。
反思机制:
``make_call_model_node`` 在每次调用 LLM 前注入反思引导提示,
模型收到后会在输出 tool_calls 的同时产出文本思考内容(思维链),
该文本思考内容被提取并记录到 think store 供前端实时展示。
可扩展性:
- ``make_call_model_node`` 可注入 streaming、重试、用量统计回调。
- ``process_tool_artifact`` 可扩展 audio、文件、结构化 JSON 等 artifact 类型。
"""
from __future__ import annotations
import json
from typing import Any, Callable
from langchain_core.messages import HumanMessage, ToolMessage
from langchain_core.messages import AIMessage, HumanMessage, ToolMessage
from agent.core.state import AgentState
from agent.memory.system_prompt import PLAN_FIRST_CALL_PROMPT, REFLECTION_PROMPT
from agent.utils.image_utils import image_bytes_to_openai_image_url_part
from agent.utils.tool_call_utils import normalize_tool_call
@@ -47,7 +54,6 @@ def _filter_short_term_memory(messages: list, trajectory_rounds: int) -> list:
for i in range(len(messages) - 1, -1, -1):
msg = messages[i]
from langchain_core.messages import AIMessage, ToolMessage
if isinstance(msg, AIMessage) and getattr(msg, "tool_calls", None):
rounds_seen += 1
@@ -61,17 +67,151 @@ def _filter_short_term_memory(messages: list, trajectory_rounds: int) -> list:
return [messages[i] for i in sorted(kept_indices)]
def _get_todolist_status() -> str:
"""获取当前会话的 todolist 状态摘要。
输出:
todolist 状态文本;无 todolist 时返回空字符串。
"""
try:
from agent.history.tool_call_recorder import get_current_session
from agent.tools.tool import get_todo_store_data
sid = get_current_session()
if not sid:
return ""
todo = get_todo_store_data(sid)
if not todo or not todo.get("steps"):
return ""
steps = todo["steps"]
done = set(todo.get("done_steps", []))
lines = []
for i, s in enumerate(steps):
status = "[已完成]" if i in done else "[待完成]"
lines.append(f" {i+1}. {status} {s}")
total = len(steps)
done_count = len(done)
header = f"当前TodoList进度:{done_count}/{total} 已完成"
return header + "\n" + "\n".join(lines)
except Exception:
return ""
def _build_reflection_prompt(agent_mode: str, is_first_call: bool) -> str | None:
"""构建反思提示词,引导 Agent 在下一步执行前进行思考。
输入:
messages: 当前消息列表(已过滤短期记忆)。
agent_mode: 运行模式("agent" | "plan")。
is_first_call: 是否为当前任务的首次 agent 调用。
输出:
反思提示文本,不需要反思时返回 None。
"""
todo_status = _get_todolist_status()
# Plan 模式首次调用:强制要求生成 todolist
if agent_mode == "plan" and is_first_call:
return PLAN_FIRST_CALL_PROMPT
# 非 plan 模式首次调用,不需要反思
if is_first_call:
return None
# 后续调用:引导模型先思考再行动
parts = [REFLECTION_PROMPT]
if todo_status:
parts.append(todo_status)
else:
parts.append("当前无 TodoList。")
return "\n".join(parts)
def _is_first_agent_call(messages: list) -> bool:
"""判断是否为当前用户任务的首轮 agent 调用。
规则:找到最后一条非 synthetic 的 HumanMessage(即用户最新输入),
检查其后是否存在 AIMessage。若不存在,说明 agent 尚未对该输入做出响应。
输入:
messages: 已过滤短期记忆的消息列表。
输出:
True 表示首次调用。
"""
# 从后向前找到最后一条非 synthetic 的 HumanMessage
last_user_idx = -1
for i in range(len(messages) - 1, -1, -1):
msg = messages[i]
if isinstance(msg, HumanMessage) and not msg.additional_kwargs.get("synthetic"):
last_user_idx = i
break
if last_user_idx < 0:
return True
# 检查该用户消息之后是否有 AIMessage
for i in range(last_user_idx + 1, len(messages)):
if isinstance(messages[i], AIMessage):
return False
return True
def make_call_model_node(
model_with_tools: Any,
trajectory_rounds: int = 3,
) -> Callable[[AgentState], dict]:
"""创建调用已绑定工具的 LLM 的图节点闭包。"""
"""创建带反思机制的调用已绑定工具的 LLM 的图节点闭包。
每次调用前注入反思引导提示;调用后提取模型同时产出的文本思考内容(content)
记录到 think store,供前端实时展示思维链。Plan 模式下首次调用强制要求生成 todolist。
"""
def call_model(state: AgentState) -> dict:
# 过滤短期记忆后再传给 LLM
all_messages = list(state["messages"])
agent_mode = state.get("agent_mode", "agent")
# 检查 abort 标志
try:
from agent.core.runtime import check_abort
from agent.history.tool_call_recorder import get_current_session
sid = get_current_session()
if sid and check_abort(sid):
raise RuntimeError("ABORTED_BY_USER")
except RuntimeError:
raise
except Exception:
pass
filtered_messages = _filter_short_term_memory(all_messages, trajectory_rounds)
response = model_with_tools.invoke(filtered_messages)
# 判断是否为首次 agent 调用(当前轮尚无 AIMessage)
is_first_call = _is_first_agent_call(filtered_messages)
# 构建反思提示并注入到消息列表(仅作引导,不记录到前端)
reflection = _build_reflection_prompt(agent_mode, is_first_call)
messages_for_llm = list(filtered_messages)
if reflection:
reflection_msg = HumanMessage(content=reflection, additional_kwargs={"synthetic": True, "reflection": True})
messages_for_llm.append(reflection_msg)
response = model_with_tools.invoke(messages_for_llm)
# 提取模型真实输出的思考内容(content),记录到前端 think 面板
# 模型同时输出 content + tool_calls 时,content 就是其思维链
response_content = getattr(response, "content", "")
if response_content and isinstance(response_content, str) and response_content.strip():
has_tool_calls = getattr(response, "tool_calls", None)
if has_tool_calls:
# 有 tool_calls 时 content 是思考过程,记录到 think 面板
try:
from agent.history.tool_call_recorder import record_reflection_live, get_current_session
sid = get_current_session()
if sid:
record_reflection_live(sid, response_content.strip())
except Exception:
pass
if hasattr(response, "tool_calls") and response.tool_calls:
for tc in response.tool_calls:
+111 -7
View File
@@ -14,6 +14,7 @@
"""
from __future__ import annotations
import threading
from dataclasses import dataclass
from typing import Any, Literal
@@ -24,14 +25,14 @@ from langgraph.errors import GraphRecursionError
from agent.core.approvals import PENDING_TOOL_APPROVALS, pending_assistant_message, remove_pending_ui_message, human_interaction_result
from agent.history.tool_call_recorder import save_turn, start_live_turn, end_live_turn, set_current_turn, set_current_session
from agent.memory.system_prompt import TEAM_MODE_PROMPT
from agent.memory.system_prompt import PLAN_MODE_PROMPT, TEAM_MODE_PROMPT
from agent.core.routing import first_pending_tool_meta
from agent.core.tool_policy import classify_tool_execution
from agent.utils.agent_utils import assistant_text, get_history, get_session_meta, summarizer, update_session_meta
from agent.utils.tool_call_utils import normalize_tool_call
from web.ui_session import rewrite_user_message_files_to_session_dir, session_dir, sync_manifest_from_chat_history
AgentMode = Literal["agent", "team"]
AgentMode = Literal["agent", "team", "plan"]
@dataclass
@@ -66,6 +67,39 @@ class AgentRuntime:
_OOM_MESSAGE = "OOM: 已达到最大迭代次数限制,任务未能完成。请简化任务或增加 max_iterations 配置后重试。"
# ---------- Abort 机制 ----------
_abort_flags: dict[str, threading.Event] = {}
_abort_lock = threading.Lock()
def set_abort_flag(session_id: str) -> None:
"""设置指定会话的 abort 标志,通知正在执行的 Agent 终止。"""
if not session_id:
return
with _abort_lock:
event = _abort_flags.get(session_id)
if event is None:
event = threading.Event()
_abort_flags[session_id] = event
event.set()
def check_abort(session_id: str) -> bool:
"""检查指定会话是否已被标记 abort。"""
if not session_id:
return False
with _abort_lock:
event = _abort_flags.get(session_id)
return event is not None and event.is_set()
def clear_abort_flag(session_id: str) -> None:
"""清除指定会话的 abort 标志。"""
if not session_id:
return
with _abort_lock:
_abort_flags.pop(session_id, None)
def _invoke_with_recursion_limit(
runtime: AgentRuntime,
@@ -177,11 +211,12 @@ def _invoke_after_manual_tool_result(
session_id: str,
*,
max_steps: int = 8,
agent_mode: str = "agent",
) -> tuple[list[Any], dict[str, Any] | None]:
"""人工确认后继续推进图,并在遇到新的待确认项时暂停。"""
current_messages = messages
for _ in range(max_steps):
result = _invoke_with_recursion_limit(runtime, runtime.graph, {"messages": current_messages}, {"configurable": {"session_id": session_id}})
result = _invoke_with_recursion_limit(runtime, runtime.graph, {"messages": current_messages, "agent_mode": agent_mode}, {"configurable": {"session_id": session_id}})
all_messages = result["messages"]
pending_meta = first_pending_tool_meta(all_messages, session_id)
if pending_meta:
@@ -276,10 +311,13 @@ def execute_agent(
sync_manifest_from_chat_history(session_id, chat_history, "")
return chat_history
# Plan 模式使用专用系统提示词
system_prompt = PLAN_MODE_PROMPT if agent_mode == "plan" else runtime.system_prompt
messages, context_exceeded = summarizer(
session_id=session_id,
agent_name=runtime.name,
system_prompt=runtime.system_prompt,
system_prompt=system_prompt,
user_content=user_content,
llm=runtime.llm,
)
@@ -304,14 +342,38 @@ def execute_agent(
if session_id:
turn_id = start_live_turn(session_id)
set_current_session(session_id)
result = _invoke_with_recursion_limit(runtime, runtime.graph, {"messages": messages}, graph_config)
clear_abort_flag(session_id)
result = _invoke_with_recursion_limit(runtime, runtime.graph, {"messages": messages, "agent_mode": agent_mode}, graph_config)
set_current_turn("")
set_current_session("")
# 检查是否被 abort
if session_id and check_abort(session_id):
clear_abort_flag(session_id)
end_live_turn(session_id)
try:
from agent.tools.tool import clear_todo_store_session
clear_todo_store_session(session_id)
except Exception:
pass
rolled_back = list(chat_history)
while rolled_back and rolled_back[-1].get("role") != "user":
rolled_back.pop()
if rolled_back:
rolled_back.pop()
if session_id:
sync_manifest_from_chat_history(session_id, rolled_back, "")
return rolled_back
all_messages = result["messages"]
pending_meta = first_pending_tool_meta(all_messages, session_id)
if pending_meta:
end_live_turn(session_id)
_remember_pending_user_content(pending_meta, user_content)
# 存储 agent_mode 以便 continue 时恢复
approval_id = _pending_action_id(pending_meta)
if approval_id and approval_id in PENDING_TOOL_APPROVALS:
PENDING_TOOL_APPROVALS[approval_id]["agent_mode"] = agent_mode
chat_history.append(pending_assistant_message(pending_meta))
if session_id:
sync_manifest_from_chat_history(session_id, chat_history, "")
@@ -361,6 +423,40 @@ def execute_agent(
if session_id and turn_id:
save_turn(session_id, turn_id, {"role": "user", "content": user_content}, all_messages)
# 任务正常完成:清空 todolist 防止跨任务纠缠
if session_id:
try:
from agent.tools.tool import clear_todo_store_session
clear_todo_store_session(session_id)
except Exception:
pass
except RuntimeError as e:
if str(e) == "ABORTED_BY_USER":
set_current_turn("")
set_current_session("")
clear_abort_flag(session_id)
end_live_turn(session_id)
try:
from agent.tools.tool import clear_todo_store_session
clear_todo_store_session(session_id)
except Exception:
pass
rolled_back = list(chat_history)
while rolled_back and rolled_back[-1].get("role") != "user":
rolled_back.pop()
if rolled_back:
rolled_back.pop()
if session_id:
sync_manifest_from_chat_history(session_id, rolled_back, "")
return rolled_back
import traceback
set_current_turn("")
set_current_session("")
end_live_turn(session_id)
print("[ERROR] 调用模型时出错:")
traceback.print_exc()
chat_history.append({"role": "assistant", "content": "抱歉,我遇到了一些问题,请稍后再试。"})
except Exception:
import traceback
set_current_turn("")
@@ -413,6 +509,8 @@ def continue_after_human_action(
remove_pending_ui_message(chat_history, approval_id)
agent_mode = pending.get("agent_mode", "agent")
if decision == "reject" and pending.get("type") != "human_interaction":
content = "已拒绝,本次待确认操作不会执行。"
chat_history.append({"role": "assistant", "content": content, "meta": {"output_type": "text"}})
@@ -428,7 +526,7 @@ def continue_after_human_action(
call_id = tool_call.get("id") or f"human_{approval_id}"
tool_content = human_interaction_result(pending, decision, instruction)
prior_messages.append(ToolMessage(content=tool_content, tool_call_id=call_id, name="human_interaction"))
all_messages, pending_meta = _invoke_after_manual_tool_result(runtime, prior_messages, session_id)
all_messages, pending_meta = _invoke_after_manual_tool_result(runtime, prior_messages, session_id, agent_mode=agent_mode)
if pending_meta:
_remember_pending_user_content(pending_meta, pending.get("user_content"))
chat_history.append(pending_assistant_message(pending_meta))
@@ -485,7 +583,7 @@ def continue_after_human_action(
if tool_artifact:
msg_kwargs["artifact"] = tool_artifact
prior_messages.append(ToolMessage(**msg_kwargs))
all_messages, pending_meta = _invoke_after_manual_tool_result(runtime, prior_messages, session_id)
all_messages, pending_meta = _invoke_after_manual_tool_result(runtime, prior_messages, session_id, agent_mode=agent_mode)
if pending_meta:
_remember_pending_user_content(pending_meta, pending.get("user_content"))
chat_history.append(pending_assistant_message(pending_meta))
@@ -512,5 +610,11 @@ def continue_after_human_action(
_persist_messages_from_pending_turn(session_id, persisted_messages, pending)
if session_id:
save_turn(session_id, manual_turn_id, {"role": "user", "content": pending.get("user_content") or ""}, persisted_messages)
# 任务完成:清空 todolist
try:
from agent.tools.tool import clear_todo_store_session
clear_todo_store_session(session_id)
except Exception:
pass
sync_manifest_from_chat_history(session_id, chat_history, "")
return chat_history
+6 -4
View File
@@ -1,26 +1,27 @@
"""LangGraph Agent 状态类型定义。
"""LangGraph 状态类型定义。
系统定位:
定义图运行时共享状态 ``AgentState``,被 ``graph``、``nodes``、
``routing`` 作为 StateGraph 的 schema 使用。
可扩展性:
- 可在此增加 ``session_id``、``agent_mode``、``pending_approval`` 等字段,
- 可在此增加 ``session_id``、``pending_approval`` 等字段,
需配合 reducer(如 add_messages)声明合并策略。
"""
from __future__ import annotations
from typing import Annotated, Sequence, TypedDict
from typing import Annotated, Literal, Sequence, TypedDict
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messages
class AgentState(TypedDict):
"""LangGraph 图状态:消息列表为唯一状态字段。
"""LangGraph 图状态。
字段:
messages: 对话消息序列,通过 ``add_messages`` 追加合并。
agent_mode: 运行模式 — "agent"(标准)| "plan"(先规划再执行)| "team"(多代理)。
系统定位:
ReAct 循环(agent -> tools -> process_tool_artifact -> agent)的载体。
@@ -30,3 +31,4 @@ class AgentState(TypedDict):
"""
messages: Annotated[Sequence[BaseMessage], add_messages]
agent_mode: str # "agent" | "plan" | "team"
+1 -1
View File
@@ -27,7 +27,7 @@
"name": "browser_control",
"display_name": "BrowserControl",
"description": "统一控制浏览器:打开/关闭浏览器、刷新/关闭标签页、打开指定 URL。",
"permission": "confirm",
"permission": "direct",
"auto_execute_rules": [
{
"parameter": "action",
Binary file not shown.
@@ -1,51 +0,0 @@
{
"version": 3,
"messages": [
{
"role": "user",
"user": {
"content": [
{
"type": "text",
"text": "截张图看看我在干啥,如果读不到图片请直接告诉我"
}
]
}
},
{
"role": "assistant",
"assistant": {
"text": "根据截图,你正在使用 **DeepSeek 开放平台**(platform.deepseek.com)的网页界面。\n\n具体来说,你当前查看的是 **“用量信息”** 页面。页面上显示了以下关键信息:\n* **充值余额**:¥22.77 CNY\n* **六月消费**(按 UTC+0 时间):¥17.22 CNY\n* **每月用量图表**:展示了近期(6月1日至6月30日)的消费金额波动。\n* **模型使用情况**:下方还列出了 `deepseek-v4-pro` 模型的 API 请求次数和 Tokens 消耗量。\n\n简单来说,你正在查看自己在 DeepSeek 平台上的账户余额、消费记录以及 API 的使用情况。",
"output_type": "text",
"autoplay": false,
"audio_duration_seconds": null,
"audio_relpath": null,
"pending_action": null,
"agent_mode": null
}
},
{
"role": "user",
"user": {
"content": [
{
"type": "text",
"text": "你现在的对话记录中有图片吗"
}
]
}
},
{
"role": "assistant",
"assistant": {
"text": "根据刚才截取的屏幕截图,我**没有**在当前的对话记录中看到任何图片。\n\n这张截图显示的是你正在浏览 **DeepSeek 开放平台** 的“用量信息”页面,主要内容包括:\n1. **充值余额**:¥22.77 CNY\n2. **六月消费**(按 UTC+0 时间):¥17.22 CNY\n3. **每月用量图表**:展示了近期每天的消费金额波动。\n4. **模型使用情况**:下方列出了 `deepseek-v4-pro` 模型的 API 请求次数和 Tokens 消耗量。\n\n所以,目前的对话中只有文字交互,并没有上传图片。",
"output_type": "text",
"autoplay": false,
"audio_duration_seconds": null,
"audio_relpath": null,
"pending_action": null,
"agent_mode": null
}
}
]
}
@@ -1,74 +0,0 @@
{
"version": 3,
"messages": [
{
"role": "user",
"user": {
"content": [
{
"type": "text",
"text": "帮我打开bilibili,点击搜索“麻薯波比呀”,观看他发布的最新视频"
}
]
}
},
{
"role": "assistant",
"assistant": {
"text": "好的,我已经帮你完成了所有操作:\n1. 打开了Bilibili网站。\n2. 在搜索框中输入“麻薯波比呀”并进行搜索。\n3. 在搜索结果中找到了该UP主的最新视频《美国答应给伊朗3000亿,但美国不出钱》。\n4. 点击播放了该视频。\n\n现在视频正在播放中,你可以观看了。",
"output_type": "text",
"autoplay": false,
"audio_duration_seconds": null,
"audio_relpath": null,
"pending_action": null,
"agent_mode": null
}
},
{
"role": "user",
"user": {
"content": [
{
"type": "text",
"text": "你好"
}
]
}
},
{
"role": "assistant",
"assistant": {
"text": "抱歉,我遇到了一些问题,请稍后再试。",
"output_type": "text",
"autoplay": false,
"audio_duration_seconds": null,
"audio_relpath": null,
"pending_action": null,
"agent_mode": null
}
},
{
"role": "user",
"user": {
"content": [
{
"type": "text",
"text": "你好"
}
]
}
},
{
"role": "assistant",
"assistant": {
"text": "你好!看起来你正在使用一个聊天界面。有什么我可以帮你的吗?",
"output_type": "text",
"autoplay": false,
"audio_duration_seconds": null,
"audio_relpath": null,
"pending_action": null,
"agent_mode": null
}
}
]
}
@@ -1,28 +0,0 @@
{
"version": 3,
"messages": [
{
"role": "user",
"user": {
"content": [
{
"type": "text",
"text": "帮我打开bilibili,点击搜索“麻薯波比呀”,观看他发布的最新视频"
}
]
}
},
{
"role": "assistant",
"assistant": {
"text": "好的,我已经成功打开了Bilibili网站,搜索了UP主“麻薯波比呀”,并按发布时间排序找到了他的最新视频。当前屏幕上正在播放的视频标题为《美国答应给伊朗3000亿, 但美国不出钱》,发布者为“麻薯波比呀”。\n\n任务已完成,您现在可以观看这个视频。",
"output_type": "text",
"autoplay": false,
"audio_duration_seconds": null,
"audio_relpath": null,
"pending_action": null,
"agent_mode": null
}
}
]
}
@@ -1,51 +0,0 @@
{
"version": 3,
"messages": [
{
"role": "user",
"user": {
"content": [
{
"type": "text",
"text": "你好"
}
]
}
},
{
"role": "assistant",
"assistant": {
"text": "抱歉,我遇到了一些问题,请稍后再试。",
"output_type": "text",
"autoplay": false,
"audio_duration_seconds": null,
"audio_relpath": null,
"pending_action": null,
"agent_mode": null
}
},
{
"role": "user",
"user": {
"content": [
{
"type": "text",
"text": "你好"
}
]
}
},
{
"role": "assistant",
"assistant": {
"text": "你好!有什么我可以帮你的吗?",
"output_type": "text",
"autoplay": false,
"audio_duration_seconds": null,
"audio_relpath": null,
"pending_action": null,
"agent_mode": null
}
}
]
}
@@ -0,0 +1,16 @@
{
"version": 3,
"messages": [
{
"role": "user",
"user": {
"content": [
{
"type": "text",
"text": "1、打开https://account.cnblogs.com/signin?returnUrl=https:%2F%2Fwww.cnblogs.com%2Fmegshuai%2Fp%2F18518288#password;\r\n2、输入账号:19553226590;密码:3139785954并点击登录"
}
]
}
}
]
}
@@ -0,0 +1,28 @@
{
"version": 3,
"messages": [
{
"role": "user",
"user": {
"content": [
{
"type": "text",
"text": "请按照以下步骤进行:\r\n1、https://account.cnblogs.com/signin?returnUrl=https:%2F%2Fwww.cnblogs.com%2Fmegshuai%2Fp%2F18518288登录该网站\r\n2、输入账号:19553226590;密码:3139785954\r\n3、点击登录"
}
]
}
},
{
"role": "assistant",
"assistant": {
"text": "1. 分析上一轮执行结果:上一轮调用了 `todo_list` 标记所有步骤完成,结果显示任务已全部完成(9/9)。从之前的截图可以看到,登录尝试失败了,页面显示\"用户名或密码错误\"的红色提示。\n\n2. 任务状态:所有规划步骤已完成,但登录结果是失败的。需要向用户报告最终结果。\n\n3. 下一步操作:任务已完成,向用户汇报执行过程和结果。\n\n## 任务执行总结\n\n我已按照您的要求完成了所有步骤:\n\n✅ **已完成的步骤:**\n1. 打开浏览器并访问登录页面\n2. 输入账号:19553226590\n3. 输入密码:3139785954\n4. 点击登录按钮\n\n❌ **登录结果:失败**\n\n页面显示错误提示:\"**用户名或密码错误**\"\n\n可能的原因:\n- 账号或密码输入有误\n- 账号密码已变更\n- 账号可能不存在或被禁用\n\n建议您:\n1. 核对账号密码是否正确\n2. 尝试使用\"忘记密码\"功能重置密码\n3. 确认账号是否已注册并激活",
"output_type": "text",
"autoplay": false,
"audio_duration_seconds": null,
"audio_relpath": null,
"pending_action": null,
"agent_mode": null
}
}
]
}
+46 -1
View File
@@ -145,8 +145,9 @@ def _artifact_image_data_urls(artifact: Any | None) -> list[str]:
def end_live_turn(session_id: str) -> list[dict[str, Any]]:
"""结束实时记录并返回该 turn 所有记录。"""
"""结束实时记录并返回该 turn 所有记录(同时清空反思)。"""
set_current_turn("")
clear_live_reflections(session_id)
with _live_lock:
return _live_records.pop(session_id, [])
@@ -164,6 +165,50 @@ def _short_args(args: dict[str, Any], max_len: int = 40) -> str:
return s
# ---------- 反思内容共享存储 ----------
# Agent 反思(think)内容通过此 store 实时推送到前端展示
_think_store: dict[str, list[dict[str, Any]]] = {}
_think_lock = threading.Lock()
def record_reflection_live(session_id: str, content: str) -> None:
"""记录一次反思内容到共享存储,供前端轮询展示。
输入:
session_id: 会话 ID。
content: 反思提示文本。
输出: 无。
"""
if not session_id or not content:
return
with _think_lock:
if session_id not in _think_store:
_think_store[session_id] = []
# 避免重复记录相同内容
for entry in _think_store[session_id]:
if entry["content"] == content:
return
entry = {
"content": content,
"summary": content[:60].replace("\n", " "),
"timestamp": time.time(),
}
_think_store[session_id].append(entry)
def get_live_reflections(session_id: str) -> list[dict[str, Any]]:
"""获取当前会话的反思列表(前端轮询)。"""
with _think_lock:
return list(_think_store.get(session_id, []))
def clear_live_reflections(session_id: str) -> None:
"""清空指定会话的反思记录。"""
with _think_lock:
_think_store.pop(session_id, None)
# ---------- 持久化 ----------
def _ensure_dir(path: Path) -> None:
path.mkdir(parents=True, exist_ok=True)
Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 249 KiB

@@ -1,23 +0,0 @@
{
"session_id": "20260620_183029",
"turn_id": "20260620_183034",
"user_message": {
"role": "user",
"content": "截张图看看我在干啥,如果读不到图片请直接告诉我"
},
"tool_calls": [
{
"name": "gui_tool",
"args": {
"action": "screenshot"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_0_0.png"
],
"result_images": []
}
],
"assistant_response": "根据截图,你正在使用 **DeepSeek 开放平台**(platform.deepseek.com)的网页界面。\n\n具体来说,你当前查看的是 **“用量信息”** 页面。页面上显示了以下关键信息:\n* **充值余额**:¥22.77 CNY\n* **六月消费**(按 UTC+0 时间):¥17.22 CNY\n* **每月用量图表**:展示了近期(6月1日至6月30日)的消费金额波动。\n* **模型使用情况**:下方还列出了 `deepseek-v4-pro` 模型的 API 请求次数和 Tokens 消耗量。\n\n简单来说,你正在查看自己在 DeepSeek 平台上的账户余额、消费记录以及 API 的使用情况。",
"timestamp": "20260620_183034"
}
@@ -1,23 +0,0 @@
{
"session_id": "20260620_183029",
"turn_id": "20260620_183128",
"user_message": {
"role": "user",
"content": "你现在的对话记录中有图片吗"
},
"tool_calls": [
{
"name": "gui_tool",
"args": {
"action": "screenshot"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_0_0.png"
],
"result_images": []
}
],
"assistant_response": "根据刚才截取的屏幕截图,我**没有**在当前的对话记录中看到任何图片。\n\n这张截图显示的是你正在浏览 **DeepSeek 开放平台** 的“用量信息”页面,主要内容包括:\n1. **充值余额**:¥22.77 CNY\n2. **六月消费**(按 UTC+0 时间):¥17.22 CNY\n3. **每月用量图表**:展示了近期每天的消费金额波动。\n4. **模型使用情况**:下方列出了 `deepseek-v4-pro` 模型的 API 请求次数和 Tokens 消耗量。\n\n所以,目前的对话中只有文字交互,并没有上传图片。",
"timestamp": "20260620_183128"
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 975 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 974 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 669 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 750 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 746 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 592 KiB

@@ -1,109 +0,0 @@
{
"session_id": "20260621_160508",
"turn_id": "20260621_160537",
"user_message": {
"role": "user",
"content": "帮我打开bilibili,点击搜索“麻薯波比呀”,观看他发布的最新视频"
},
"tool_calls": [
{
"name": "browser_control",
"args": {
"action": "open",
"url": "https://www.bilibili.com"
},
"result_text": "已尝试打开 URL: https://www.bilibili.com",
"result_files": [
"_artifact_browser_control_0_0.png"
],
"result_images": []
},
{
"name": "browser_control",
"args": {
"action": "open",
"url": "current"
},
"result_text": "已刷新当前标签页",
"result_files": [
"_artifact_browser_control_1_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "click",
"element_description": "bilibili website search bar at the top of the page"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_0_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"text": "麻薯波比呀",
"enter": true,
"action": "type"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_1_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "wait",
"wait_seconds": 3
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_2_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "click",
"element_description": "the first video thumbnail in the search results, titled \"美国答应给伊朗3000亿,美国又开始打窝了?\""
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_3_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "wait",
"wait_seconds": 5
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_4_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "click",
"element_description": "the main video player area to pause the video"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_5_0.png"
],
"result_images": []
}
],
"assistant_response": "好的,我已经帮你完成了所有操作:\n1. 打开了Bilibili网站。\n2. 在搜索框中输入“麻薯波比呀”并进行搜索。\n3. 在搜索结果中找到了该UP主的最新视频《美国答应给伊朗3000亿,但美国不出钱》。\n4. 点击播放了该视频。\n\n现在视频正在播放中,你可以观看了。",
"timestamp": "20260621_160537"
}
@@ -1,24 +0,0 @@
{
"session_id": "20260621_160508",
"turn_id": "20260622_123753",
"user_message": {
"role": "user",
"content": "你好"
},
"tool_calls": [
{
"name": "browser_control",
"args": {
"action": "open",
"url": "https://www.bilibili.com"
},
"result_text": "已尝试打开 URL: https://www.bilibili.com",
"result_files": [
"_artifact_browser_control_0_0.png"
],
"result_images": []
}
],
"assistant_response": "你好!看起来你正在使用一个聊天界面。有什么我可以帮你的吗?",
"timestamp": "20260622_123753"
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 982 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 683 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 982 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 965 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 749 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 770 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 786 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 687 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 696 KiB

@@ -1,170 +0,0 @@
{
"session_id": "20260622_135934",
"turn_id": "20260622_140405",
"user_message": {
"role": "user",
"content": "帮我打开bilibili,点击搜索“麻薯波比呀”,观看他发布的最新视频"
},
"tool_calls": [
{
"name": "browser_control",
"args": {
"action": "open",
"url": "https://www.bilibili.com"
},
"result_text": "已尝试打开 URL: https://www.bilibili.com",
"result_files": [
"_artifact_browser_control_0_0.png"
],
"result_images": []
},
{
"name": "browser_control",
"args": {
"action": "open",
"url": "https://www.bilibili.com"
},
"result_text": "已尝试打开 URL: https://www.bilibili.com",
"result_files": [
"_artifact_browser_control_1_0.png"
],
"result_images": []
},
{
"name": "browser_control",
"args": {
"action": "open",
"url": "https://www.bilibili.com"
},
"result_text": "已尝试打开 URL: https://www.bilibili.com",
"result_files": [
"_artifact_browser_control_2_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "click",
"element_description": "搜索栏"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_0_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "type",
"text": "麻薯波比呀"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_1_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "hotkey",
"keys": [
"enter"
]
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_2_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "click",
"element_description": "最新发布 按钮"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_3_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "click",
"element_description": "最新发布的视频,缩略图上有特朗普和伊朗国旗,标题为“美国答应给伊朗3000亿, 但美国不出钱”"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_4_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "click",
"element_description": "视频播放器中央区域"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_5_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "click",
"element_description": "暂停/播放按钮"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_6_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "click",
"element_description": "播放按钮"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_7_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"action": "click",
"element_description": "“取消”按钮"
},
"result_text": "",
"result_files": [
"_artifact_gui_tool_8_0.png"
],
"result_images": []
},
{
"name": "browser_control",
"args": {
"action": "open",
"url": "current"
},
"result_text": "已刷新当前标签页",
"result_files": [
"_artifact_browser_control_3_0.png"
],
"result_images": []
}
],
"assistant_response": "好的,我已经成功打开了Bilibili网站,搜索了UP主“麻薯波比呀”,并按发布时间排序找到了他的最新视频。当前屏幕上正在播放的视频标题为《美国答应给伊朗3000亿, 但美国不出钱》,发布者为“麻薯波比呀”。\n\n任务已完成,您现在可以观看这个视频。",
"timestamp": "20260622_140405"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

@@ -0,0 +1,172 @@
{
"session_id": "20260627_175913",
"turn_id": "20260627_180047",
"user_message": {
"role": "user",
"content": "请按照以下步骤进行:\r\n1、https://account.cnblogs.com/signin?returnUrl=https:%2F%2Fwww.cnblogs.com%2Fmegshuai%2Fp%2F18518288登录该网站\r\n2、输入账号:19553226590;密码:3139785954\r\n3、点击登录"
},
"tool_calls": [
{
"name": "todo_list",
"args": {
"steps": [
"打开浏览器",
"在地址栏输入登录URL并访问",
"等待页面加载完成",
"点击账号输入框",
"输入账号19553226590",
"点击密码输入框",
"输入密码3139785954",
"点击登录按钮",
"验证登录是否成功"
],
"done_step": -1
},
"result_text": "{\"__todo_list__\": true, \"data\": {\"steps\": [\"打开浏览器\", \"在地址栏输入登录URL并访问\", \"等待页面加载完成\", \"点击账号输入框\", \"输入账号19553226590\", \"点击密码输入框\", \"输入密码3139785954\", \"点击登录按钮\", \"验证登录是否成功\"], \"done_steps\": []}}\n[Todo List]\n- [1/9] [Pending]: 打开浏览器\n- [2/9] [Pending]: 在地址栏输入登录URL并访问\n- [3/9] [Pending]: 等待页面加载完成\n- [4/9] [Pending]: 点击账号输入框\n- [5/9] [Pending]: 输入账号19553226590\n- [6/9] [Pending]: 点击密码输入框\n- [7/9] [Pending]: 输入密码3139785954\n- [8/9] [Pending]: 点击登录按钮\n- [9/9] [Pending]: 验证登录是否成功",
"result_files": [],
"result_images": []
},
{
"name": "browser_control",
"args": {
"action": "open",
"url": "https://account.cnblogs.com/signin?returnUrl=https:%2F%2Fwww.cnblogs.com%2Fmegshuai%2Fp%2F18518288"
},
"result_text": "已尝试打开 URL: https://account.cnblogs.com/signin?returnUrl=https:%2F%2Fwww.cnblogs.com%2Fmegshuai%2Fp%2F18518288",
"result_files": [
"_artifact_browser_control_0_0.png"
],
"result_images": []
},
{
"name": "todo_list",
"args": {
"done_step": 2
},
"result_text": "{\"__todo_list__\": true, \"data\": {\"steps\": [\"打开浏览器\", \"在地址栏输入登录URL并访问\", \"等待页面加载完成\", \"点击账号输入框\", \"输入账号19553226590\", \"点击密码输入框\", \"输入密码3139785954\", \"点击登录按钮\", \"验证登录是否成功\"], \"done_steps\": [0, 1]}}\n[Todo List]\n- [1/9] [Done]: 打开浏览器\n- [2/9] [Done]: 在地址栏输入登录URL并访问\n- [3/9] [Pending]: 等待页面加载完成\n- [4/9] [Pending]: 点击账号输入框\n- [5/9] [Pending]: 输入账号19553226590\n- [6/9] [Pending]: 点击密码输入框\n- [7/9] [Pending]: 输入密码3139785954\n- [8/9] [Pending]: 点击登录按钮\n- [9/9] [Pending]: 验证登录是否成功",
"result_files": [],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"actions": [
{
"action": "click",
"element_description": "登录用户名/邮箱输入框"
}
]
},
"result_text": "1. Clicked target. grounded (502,531)",
"result_files": [
"_artifact_gui_tool_0_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"actions": [
{
"action": "type",
"element_description": "登录用户名/邮箱输入框",
"text": "19553226590"
}
]
},
"result_text": "1. Typed text.",
"result_files": [
"_artifact_gui_tool_1_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"actions": [
{
"action": "click",
"element_description": "密码输入框"
}
]
},
"result_text": "1. Clicked target. grounded (501,592)",
"result_files": [
"_artifact_gui_tool_2_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"actions": [
{
"action": "type",
"element_description": "密码输入框",
"text": "3139785954"
}
]
},
"result_text": "1. Typed text.",
"result_files": [
"_artifact_gui_tool_3_0.png"
],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"actions": [
{
"action": "click",
"element_description": "登录按钮"
}
]
},
"result_text": "1. Clicked target. grounded (500,689)",
"result_files": [
"_artifact_gui_tool_4_0.png"
],
"result_images": []
},
{
"name": "todo_list",
"args": {
"done_step": 8
},
"result_text": "{\"__todo_list__\": true, \"data\": {\"steps\": [\"打开浏览器\", \"在地址栏输入登录URL并访问\", \"等待页面加载完成\", \"点击账号输入框\", \"输入账号19553226590\", \"点击密码输入框\", \"输入密码3139785954\", \"点击登录按钮\", \"验证登录是否成功\"], \"done_steps\": [0, 1, 2, 3, 4, 5, 6, 7]}}\n[Todo List]\n- [1/9] [Done]: 打开浏览器\n- [2/9] [Done]: 在地址栏输入登录URL并访问\n- [3/9] [Done]: 等待页面加载完成\n- [4/9] [Done]: 点击账号输入框\n- [5/9] [Done]: 输入账号19553226590\n- [6/9] [Done]: 点击密码输入框\n- [7/9] [Done]: 输入密码3139785954\n- [8/9] [Done]: 点击登录按钮\n- [9/9] [Pending]: 验证登录是否成功",
"result_files": [],
"result_images": []
},
{
"name": "gui_tool",
"args": {
"actions": [
{
"action": "wait",
"wait_seconds": 3.0
},
{
"action": "screenshot"
}
]
},
"result_text": "1. Waited 1.50 seconds.\n2. Screenshot (skipped, final screenshot will be taken)",
"result_files": [
"_artifact_gui_tool_5_0.png"
],
"result_images": []
},
{
"name": "todo_list",
"args": {
"done_step": 9
},
"result_text": "{\"__todo_list__\": true, \"data\": {\"steps\": [\"打开浏览器\", \"在地址栏输入登录URL并访问\", \"等待页面加载完成\", \"点击账号输入框\", \"输入账号19553226590\", \"点击密码输入框\", \"输入密码3139785954\", \"点击登录按钮\", \"验证登录是否成功\"], \"done_steps\": [0, 1, 2, 3, 4, 5, 6, 7, 8]}}\n[Todo List]\n- [1/9] [Done]: 打开浏览器\n- [2/9] [Done]: 在地址栏输入登录URL并访问\n- [3/9] [Done]: 等待页面加载完成\n- [4/9] [Done]: 点击账号输入框\n- [5/9] [Done]: 输入账号19553226590\n- [6/9] [Done]: 点击密码输入框\n- [7/9] [Done]: 输入密码3139785954\n- [8/9] [Done]: 点击登录按钮\n- [9/9] [Done]: 验证登录是否成功",
"result_files": [],
"result_images": []
}
],
"assistant_response": "1. 分析上一轮执行结果:上一轮调用了 `todo_list` 标记所有步骤完成,结果显示任务已全部完成(9/9)。从之前的截图可以看到,登录尝试失败了,页面显示\"用户名或密码错误\"的红色提示。\n\n2. 任务状态:所有规划步骤已完成,但登录结果是失败的。需要向用户报告最终结果。\n\n3. 下一步操作:任务已完成,向用户汇报执行过程和结果。\n\n## 任务执行总结\n\n我已按照您的要求完成了所有步骤:\n\n✅ **已完成的步骤:**\n1. 打开浏览器并访问登录页面\n2. 输入账号:19553226590\n3. 输入密码:3139785954\n4. 点击登录按钮\n\n❌ **登录结果:失败**\n\n页面显示错误提示:\"**用户名或密码错误**\"\n\n可能的原因:\n- 账号或密码输入有误\n- 账号密码已变更\n- 账号可能不存在或被禁用\n\n建议您:\n1. 核对账号密码是否正确\n2. 尝试使用\"忘记密码\"功能重置密码\n3. 确认账号是否已注册并激活",
"timestamp": "20260627_180047"
}
+47
View File
@@ -75,6 +75,53 @@ DB_SYSTEM_PROMT = """
请记住,你是一个协作伙伴,目标是让用户以最小的学习成本从数据库中获得有价值的信息。开始工作吧!
""".strip()
PLAN_MODE_PROMPT = """
你是一个具备多模态理解能力的桌面操作助手,运行在 **Plan 模式**下。Plan 模式要求你在执行任务前先进行详细规划。
【Plan 模式核心规则】
- **首要任务**:收到用户请求后,你必须**第一步就调用 todo_list 工具**,将用户的任务拆解为非常细致、可执行的步骤列表。每个步骤应该具体到单个操作(如"打开浏览器"、"搜索XXX"、"截取屏幕"、"分析结果"等)。
- **规划要求**:步骤拆解必须详尽,覆盖从开始到完成的完整流程。不要跳过任何中间步骤。步骤描述要清晰具体,便于后续逐一执行和跟踪。
- **规划完成后**:生成 todolist 后,向用户简要汇报规划结果,然后**立即开始按步骤执行**,不要等待用户确认。
- **执行过程中**:每完成一个步骤,调用 todo_list 标记该步骤为已完成(done_step),让用户实时看到进度。
- **任务完成后**:确认所有步骤已完成,向用户总结执行过程和结果。
【通用行为准则】
- 你的首要职责是理解用户的意图,并高效地完成用户的任务。
- 对于任何用户上传的图片、音频或文件,直接利用你的多模态能力分析并回答,不要为此调用截图、OCR 等无关工具。
- 只有在信息确实无法从当前对话或上传内容中获取,且必须通过外部工具才能获得时,才调用工具。
- 当你调用工具收到截图或返回结果后,必须仔细观察返回内容,基于实际结果继续推进任务,严禁脱离实际结果凭空编造。
- 每次工具调用后,向用户简要汇报当前进度和下一步计划,确保用户始终了解任务状态。
- 如果不确定是否需要工具,优先选择不调用,用已有信息给出最佳答案。
""".strip()
# ---------- 反思 / Plan 首轮注入提示(作为 synthetic HumanMessage 注入到对话上下文)----------
# 这些不是系统提示词,而是在 call_model 节点中动态拼入消息列表的引导文本。
PLAN_FIRST_CALL_PROMPT = """
【系统指令 - Plan 模式】
你现在处于 Plan 模式。请**立即调用 todo_list 工具**,按照用户任务拆解为步骤列表。
规划要求:
- 如果用户任务包含多个子任务,每个子任务都需要被拆解为一个步骤。
- 每一步骤必须具体到GUI操作(如"打开XXX浏览器"、"搜索XXX"、"单击XXX"等),但注意必须是确定的GUI操作,不能是模糊的操作(如"找到XXX按钮"等)。
- **重要:合并同类操作**。同一个页面/界面上的多个连续操作应合并为一条步骤,用"并"连接,而不是拆成多条。例如:
* "点击顶部搜索框,输入'燕三嘤嘤嘤'并点击搜索"(合并了点击、输入、搜索三个操作)
* "在搜索结果中找到燕三嘤嘤嘤并点击头像进入他的主页"(合并了查找和点击)
* "在他的主页点开视频列表里的第一个视频并等待播放"(合并了点击和验证)
* "打开哔哩哔哩网站"(单个操作不需要合并)
* 反面示例(过于细碎,禁止):"1.点击搜索框 2.输入文字 3.点击搜索按钮 4.找到用户 5.点击头像"
- 步骤覆盖从开始到完成的完整流程,不要遗漏任何中间步骤,然后立即开始执行第一步,无需等待用户确认。
- 请注意:如果用户明确分条步骤,每个步骤都需要被拆解为一个步骤(但仍需合并同一页面的连续操作)。
""".strip()
REFLECTION_PROMPT = """
【请先在你的回复中输出你的反思,然后再调用工具或给出最终回复】
你需要先用简短的一句话在文字中思考下一步该做什么,然后进行相应的工具调用。格式如下:
1. 先分析上一轮执行结果:上一个调用了什么工具?结果是成功还是失败?
2. 如果上一轮是 GUI 操作(点击、输入等)但未命中目标或未达预期效果,请根据最新的截图重新估算目标位置,调整坐标或参数后重试。
3. 如果上一轮操作成功,说明你根据分析结果进行下一步操作。
4. 然后调用对应的工具执行下一步,或如果任务已完成则直接回复用户(注意只需要回复用户最终结果即可)。
""".strip()
TEAM_MODE_PROMPT = """
Team 模式目前处于预留阶段,多 Agent 协同功能尚未实现。
请向用户说明当前无法启动 Team 协同模式,并建议使用 Agent 模式来完成单 Agent 任务。
Binary file not shown.
Binary file not shown.
+78 -76
View File
@@ -15,31 +15,30 @@ from PIL import Image
from pydantic import BaseModel, Field
from agent.core.llm import llm
from agent.utils.env_utils import GROUNDING_HEIGHT, GROUNDING_WIDTH
import agent.utils.env_utils as env_utils
GUIAction = Literal[
"click",
"type",
"clickandtype",
"drag_and_drop",
"scroll",
"hotkey",
"hold_and_press",
"wait",
"screenshot",
"move_to",
"move_to",
]
class GUIToolInput(BaseModel):
# action 字段保持原样,无需修改
action: Optional[GUIAction] = Field(
default=None,
description="GUI action to execute. If None or empty, returns current screenshot.",
class GUIActionItem(BaseModel):
"""A single GUI action within an ordered sequence."""
action: GUIAction = Field(
...,
description="GUI action to execute.",
)
element_description: Optional[str] = Field(
default=None,
description="Natural-language description of the target screen element for grounded actions.",
description="Natural-language description of the target screen element for grounded actions (click, type, scroll, drag_and_drop, move_to). For type action, providing this will first locate and click the target input field before typing.",
)
ending_description: Optional[str] = Field(
default=None,
@@ -58,6 +57,13 @@ class GUIToolInput(BaseModel):
wait_seconds: float = Field(default=0.5, description="Seconds to wait.")
class GUIToolInput(BaseModel):
actions: list[GUIActionItem] = Field(
default_factory=list,
description="Ordered list of GUI actions to execute sequentially. Each item specifies one GUI operation (click, type, drag_and_drop, scroll, hotkey, hold_and_press, wait, screenshot, move_to). If empty, returns current screenshot without performing any action.",
)
def _get_gui_region() -> dict | None:
"""获取当前 GUI 操作显示器区域,失败返回 None(全屏)。"""
try:
@@ -81,7 +87,7 @@ def _screenshot_png() -> tuple[bytes, tuple[int, int]]:
def _resize_for_grounding(image_bytes: bytes) -> bytes:
image = Image.open(io.BytesIO(image_bytes)).convert("RGB")
image = image.resize((GROUNDING_WIDTH, GROUNDING_HEIGHT), Image.Resampling.LANCZOS)
image = image.resize((env_utils.GROUNDING_WIDTH, env_utils.GROUNDING_HEIGHT), Image.Resampling.LANCZOS)
buf = io.BytesIO()
image.save(buf, format="PNG")
return buf.getvalue()
@@ -98,8 +104,8 @@ def _parse_coordinates(text: str) -> tuple[int, int]:
raise ValueError(f"grounding model did not return coordinates: {text!r}")
x = int(float(numbers[0]))
y = int(float(numbers[1]))
x = max(0, min(GROUNDING_WIDTH - 1, x))
y = max(0, min(GROUNDING_HEIGHT - 1, y))
x = max(0, min(env_utils.GROUNDING_WIDTH - 1, x))
y = max(0, min(env_utils.GROUNDING_HEIGHT - 1, y))
return x, y
@@ -107,8 +113,8 @@ def _scale_to_screen(coords: tuple[int, int], screen_size: tuple[int, int]) -> t
"""将 grounding 坐标映射到绝对屏幕坐标(考虑 GUI 操作区域偏移)。"""
screen_width, screen_height = screen_size
x, y = coords
local_x = round(x * screen_width / GROUNDING_WIDTH)
local_y = round(y * screen_height / GROUNDING_HEIGHT)
local_x = round(x * screen_width / env_utils.GROUNDING_WIDTH)
local_y = round(y * screen_height / env_utils.GROUNDING_HEIGHT)
# 加上目标显示器在屏幕空间的偏移
region = _get_gui_region()
offset_x = region["x"] if region else 0
@@ -124,10 +130,10 @@ def _ground_element(element_description: str) -> tuple[int, int, str]:
grounding_png = _resize_for_grounding(raw_png)
prompt = (
"You are a visual grounding model for desktop GUI control.\n"
f"The screenshot has been resized to exactly {GROUNDING_WIDTH}x{GROUNDING_HEIGHT} pixels.\n"
f"The screenshot has been resized to exactly {env_utils.GROUNDING_WIDTH}x{env_utils.GROUNDING_HEIGHT} pixels.\n"
f"Query: {element_description.strip()}\n"
"Return only one target point as pixel coordinates in this exact format: x,y\n"
f"Example: {GROUNDING_WIDTH // 2},{GROUNDING_HEIGHT // 2}\n"
f"Example: {env_utils.GROUNDING_WIDTH // 2},{env_utils.GROUNDING_HEIGHT // 2}\n"
"Do not include any explanation."
)
response = llm.invoke(
@@ -183,9 +189,26 @@ class GUITool(BaseTool):
args_schema: type[BaseModel] = GUIToolInput
name: str = "gui_tool"
description: str = (
"GUI automation tool. Visually locates desktop elements from a screenshot, maps coordinates to the "
"real screen, and executes pyautogui actions. Supported actions: click, type, clickandtype, drag_and_drop, scroll, "
"hotkey, hold_and_press, wait, screenshot, move_to. Returns a screenshot of the current screen after the action."
"GUI 自动化工具。通过截图视觉定位桌面元素,将坐标映射到真实屏幕,并执行 pyautogui 动作。"
"接收一个有序的动作列表,按顺序依次执行。每个动作项支持的操作:click(点击)、type(输入文本,可通过 element_description 指定目标输入框自动聚焦)、"
"drag_and_drop(拖拽)、scroll(滚动)、hotkey(快捷键)、"
"hold_and_press(按住组合键并敲击)、wait(等待)、screenshot(截图)、move_to(移动鼠标)。\n"
"【type 使用说明】type 支持 element_description 参数来描述在哪里输入。当提供了 element_description 时,"
"会先视觉定位并点击目标输入框,然后再输入文本,无需单独调用 click。不提供 element_description 则直接在当前焦点输入。\n"
"所有动作执行完毕后,返回当前屏幕的截图。\n"
"\n"
"示例:\n"
"- 登录表单:{\"actions\": ["
"{\"action\":\"type\",\"element_description\":\"用户名输入框\",\"text\":\"admin\"},"
"{\"action\":\"type\",\"element_description\":\"密码输入框\",\"text\":\"123456\",\"enter\":true}"
"]}\n"
"- 浏览器搜索:{\"actions\": ["
"{\"action\":\"type\",\"element_description\":\"浏览器地址栏\",\"text\":\"github.com\",\"enter\":true}"
"]}\n"
"- 等待并确认:{\"actions\": ["
"{\"action\":\"click\",\"element_description\":\"提交按钮\"},"
"{\"action\":\"wait\",\"wait_seconds\":2.0}"
"]}"
)
response_format: Literal["content", "content_and_artifact"] = "content_and_artifact"
@@ -199,53 +222,32 @@ class GUITool(BaseTool):
def _run(
self,
action: Optional[str] = None,
element_description: Optional[str] = None,
ending_description: Optional[str] = None,
text: str = "",
overwrite: bool = False,
enter: bool = False,
num_clicks: int = 1,
button_type: str = "left",
hold_keys: Optional[list[str]] = None,
keys: Optional[list[str]] = None,
press_keys: Optional[list[str]] = None,
clicks: int = 0,
shift: bool = False,
wait_seconds: float = 0.0,
actions: list[GUIActionItem] | None = None,
) -> tuple[str, dict]:
# ---------- screenshot 动作:仅截图 ----------
if action == "screenshot":
return ("", self._artifact_screenshot())
# ---------- 无动作时直接截图 ----------
if not action:
if not actions:
return ("", self._artifact_screenshot())
# -------------------------------------------
dispatch_error: str | None = None
try:
self._dispatch(
action=action,
element_description=element_description,
ending_description=ending_description,
text=text,
overwrite=overwrite,
enter=enter,
num_clicks=num_clicks,
button_type=button_type,
hold_keys=hold_keys or [],
keys=keys or [],
press_keys=press_keys or [],
clicks=clicks,
shift=shift,
wait_seconds=wait_seconds,
)
except Exception as exc:
dispatch_error = f"[GUI Error] {action}: {exc}"
print(dispatch_error)
time.sleep(1)
if dispatch_error:
return dispatch_error, self._artifact_screenshot()
return "", self._artifact_screenshot()
# ---------- 顺序执行动作列表 ----------
result_messages: list[str] = [] # 收集每个动作的返回信息
for idx, act in enumerate(actions, start=1):
if act.action == "screenshot":
# screenshot 动作不需要实际执行,跳过并可选记录
result_messages.append(f"{idx}. Screenshot (skipped, final screenshot will be taken)")
continue
try:
msg = self._dispatch(**act.model_dump())
result_messages.append(f"{idx}. {msg}")
except Exception as exc:
error_msg = f"{idx}. [GUI Error] {act.action}: {exc}"
result_messages.append(error_msg)
print(error_msg)
time.sleep(1.2)
final_text = "\n".join(result_messages)
return (final_text, self._artifact_screenshot())
def _dispatch(self, **kwargs: Any) -> str:
action = str(kwargs["action"]).strip()
@@ -253,8 +255,6 @@ class GUITool(BaseTool):
return self._click(**kwargs)
if action == "type":
return self._type(**kwargs)
if action == "clickandtype":
return self._clickandtype(**kwargs)
if action == "drag_and_drop":
return self._drag_and_drop(**kwargs)
if action == "scroll":
@@ -264,7 +264,7 @@ class GUITool(BaseTool):
if action == "hold_and_press":
return self._hold_and_press(**kwargs)
if action == "wait":
seconds = min(1.0, float(kwargs["wait_seconds"]))
seconds = min(1.5, float(kwargs["wait_seconds"]))
time.sleep(seconds)
return f"Waited {seconds:.2f} seconds."
if action == "move_to":
@@ -282,6 +282,18 @@ class GUITool(BaseTool):
return f"Clicked target. {grounding}"
def _type(self, **kwargs: Any) -> str:
element_desc = (kwargs.get("element_description") or "").strip()
if element_desc:
# 提供了目标元素描述:先定位点击再输入
x, y, grounding = _ground_element(element_desc)
pyautogui.click(x, y)
if kwargs["overwrite"]:
_select_all_and_clear()
_type_text(kwargs["text"])
if kwargs["enter"]:
pyautogui.press("enter")
return f"Clicked target and typed text. {grounding}"
# 不提供 element_description:直接在当前焦点输入
if kwargs["overwrite"]:
_select_all_and_clear()
_type_text(kwargs["text"])
@@ -289,16 +301,6 @@ class GUITool(BaseTool):
pyautogui.press("enter")
return "Typed text."
def _clickandtype(self, **kwargs: Any) -> str:
x, y, grounding = _ground_element(kwargs["element_description"])
pyautogui.click(x, y)
if kwargs["overwrite"]:
_select_all_and_clear()
_type_text(kwargs["text"])
if kwargs["enter"]:
pyautogui.press("enter")
return f"Clicked target and typed text. {grounding}"
def _drag_and_drop(self, **kwargs: Any) -> str:
x1, y1, start_grounding = _ground_element(kwargs["element_description"] or "")
x2, y2, end_grounding = _ground_element(kwargs["ending_description"] or "")
+34 -24
View File
@@ -16,7 +16,7 @@ from langchain.tools import BaseTool
from pydantic import BaseModel, Field, create_model, model_validator
from agent.core.llm import llm
from agent.utils.env_utils import BROWSER_MAP, GROUNDING_HEIGHT, GROUNDING_WIDTH
import agent.utils.env_utils as env_utils
class WebSearch(BaseTool):
@@ -99,9 +99,9 @@ class BrowserControl(BaseTool):
if browser_name is None:
return webbrowser.get(), None
name_lower = browser_name.lower().strip()
if name_lower not in BROWSER_MAP:
raise ValueError(f"不支持的浏览器: {browser_name},支持: {', '.join(BROWSER_MAP.keys())}")
reg_name, title_keyword = BROWSER_MAP[name_lower]
if name_lower not in env_utils.BROWSER_MAP:
raise ValueError(f"不支持的浏览器: {browser_name},支持: {', '.join(env_utils.BROWSER_MAP.keys())}")
reg_name, title_keyword = env_utils.BROWSER_MAP[name_lower]
try:
controller = webbrowser.get(reg_name)
except webbrowser.Error:
@@ -132,7 +132,7 @@ class BrowserControl(BaseTool):
# ---------- 核心操作(返回操作结果描述) ----------
def _try_activate_any_browser(self) -> bool:
"""尝试激活任意已知浏览器窗口(不指定 browser 时的回退方案)。"""
for _reg_name, title_keyword in BROWSER_MAP.values():
for _reg_name, title_keyword in env_utils.BROWSER_MAP.values():
if self._activate_window(title_keyword):
return True
return False
@@ -212,7 +212,7 @@ class BrowserControl(BaseTool):
time.sleep(0.3)
try:
pil_img = pyautogui.screenshot()
pil_img = pil_img.resize((GROUNDING_WIDTH, GROUNDING_HEIGHT), Image.Resampling.LANCZOS)
pil_img = pil_img.resize((env_utils.GROUNDING_WIDTH, env_utils.GROUNDING_HEIGHT), Image.Resampling.LANCZOS)
buf = io.BytesIO()
pil_img.save(buf, format="PNG")
raw_png = buf.getvalue()
@@ -375,10 +375,10 @@ def update_todo_store_session(
done_steps = []
if stored_steps and 1 <= done_step <= len(stored_steps):
idx = done_step - 1
if idx not in done_steps:
done_steps.append(idx)
done_steps.sort()
for i in range(done_step):
if i not in done_steps:
done_steps.append(i)
done_steps.sort()
todo_data = {"steps": stored_steps, "done_steps": done_steps}
_todo_store[session_id] = todo_data
@@ -423,7 +423,7 @@ class TodoListInput(BaseModel):
)
done_step: int = Field(
default=-1,
description="本次新完成的步骤编号(从1开始)。-1 表示仅查看当前状态,不标记完成。",
description="当前已推进到的步骤编号(从1开始)。传入 n 则步骤 1~n 全部标记为完成。-1 表示仅查看当前状态。",
)
@model_validator(mode="before")
@@ -441,20 +441,30 @@ class TodoListInput(BaseModel):
class TodoList(BaseTool):
"""可选的任务列表工具,模型可主动调用以跟踪任务进度。"""
"""任务管理工具,用于拆分复杂任务为多个步骤并跟踪进度。
Plan 模式下此工具为**必须调用**,Agent 模式下为可选。
首次调用时传入完整步骤列表,后续仅传 done_step 标记进度。
"""
args_schema: type[BaseModel] = TodoListInput
name: str = "todo_list"
description: str = (
"可选的任务管理工具。当你需要拆分复杂任务为多个步骤并跟踪进度时调用。\n"
"任务管理工具。用于将复杂任务拆分为多个步骤并跟踪执行进度。\n"
"Plan 模式下必须首先调用此工具创建任务计划;Agent 模式下按需调用。\n"
"参数说明:\n"
"- steps (list[str], 可选):任务步骤列表。仅在首次创建计划时传入所有步骤。后续更新进度时请省略此参数(传 null 或不传),工具会复用之前设定的步骤列表,省去重复传输。\n"
"- done_step (int, 可选):刚完成的步骤编号(从1开始),一次只标记一个。不传或传 -1 则只查看当前状态不做修改。\n"
"- steps (list[str], 可选):任务步骤列表。仅在首次创建计划时传入所有步骤。\n"
" **步骤粒度要求**:同一页面/界面上的连续操作应合并为一条步骤,用\"并\"连接。例如:\n"
' * 推荐:"点击搜索框,输入XXX并点击搜索"(合并了点击、输入、搜索)\n'
' * 推荐:"在结果中点击目标进入主页"(合并了查找+点击)\n'
' * 禁止:"1.点击搜索框 2.输入文字 3.点击搜索"(过于细碎)\n'
"- done_step (int, 可选):当前已推进到的步骤编号(从1开始)。传入 n 则步骤 1~n 全部标记为已完成。不传或传 -1 则只查看当前状态。\n"
"调用示例:\n"
'- 首次创建:{"steps": ["准备食材", "切菜", "烹饪", "装盘"], "done_step": -1}\n'
'- 完成第1步:"done_step": 1}(省略 steps)\n'
'- 查看状态:不传任何参数或 {"done_step": -1}\n'
"仅在需要跟踪多步骤任务进度时调用,简单任务不需要调用。"
'- 首次创建(B站搜索示例):{"steps": ["打开哔哩哔哩网站", "点击顶部搜索框,输入\'燕三嘤嘤嘤\'并点击搜索", "在搜索结果中找到燕三嘤嘤嘤并点击头像或名称进入他的主页", "在他的主页点开视频列表里的第一个视频", "验证视频是否正在播放"], "done_step": -1}\n'
'- 已完成前2步:{"done_step": 2} (步骤1和2均标记为完成)\n'
'- 已完成前4步:{"done_step": 4}\n'
'- 查看状态:{"done_step": -1}\n'
"任务全部完成后无需再次调用。"
)
response_format: Literal["content", "content_and_artifact"] = "content"
@@ -472,12 +482,12 @@ class TodoList(BaseTool):
self._stored_steps = steps
self._done_set = []
# 标记新完成步骤(1-indexed → 0-indexed)
# 标记步骤完成:传入 done_step 时,该步及之前所有步骤均标记为完成(1-indexed → 0-indexed)
if self._stored_steps and 1 <= done_step <= len(self._stored_steps):
idx = done_step - 1
if idx not in self._done_set:
self._done_set.append(idx)
self._done_set.sort()
for i in range(done_step):
if i not in self._done_set:
self._done_set.append(i)
self._done_set.sort()
todo_data = {
"steps": self._stored_steps,
+61
View File
@@ -23,6 +23,7 @@ except Exception:
_windll = getattr(ctypes, "windll", None)
user32: object | None = _windll.user32 if os.name == "nt" and _windll is not None else None
WM_CLOSE = 0x0010
SW_RESTORE = 9
_INDEX_PATH = Path(__file__).resolve().parents[1] / "history" / "data_base" / "software_index.json"
@@ -48,6 +49,14 @@ _SKIP_KEYWORDS = (
"license",
"update",
)
_CHAT_APP_PROCESS_NAMES = {
"qq": ["QQ", "NTQQ"],
"腾讯qq": ["QQ", "NTQQ"],
"腾讯QQ": ["QQ", "NTQQ"],
"wechat": ["WeChat", "Weixin"],
"weixin": ["WeChat", "Weixin"],
"微信": ["WeChat", "Weixin"],
}
@dataclass
@@ -354,6 +363,43 @@ def _find_visible_windows_for_pids(pids: list[int]) -> list[tuple[int, int, str]
return results
def _chat_app_process_names(query: str, record: SoftwareRecord) -> list[str]:
candidates = [query, record.display_name, *record.aliases]
for candidate in candidates:
key = _normalize(candidate)
if key in _CHAT_APP_PROCESS_NAMES:
return _CHAT_APP_PROCESS_NAMES[key]
return []
def _find_pids_for_process_names(process_names: list[str]) -> list[int]:
process_keys = {_normalize(name) for name in process_names if name}
matched: list[int] = []
for proc in _list_running_processes():
if _normalize(proc["stem"]) in process_keys:
try:
matched.append(int(proc["pid"]))
except ValueError:
continue
return sorted(set(matched))
def _activate_existing_window_for_pids(pids: list[int]) -> tuple[int, int, str] | None:
if user32 is None or not pids:
return None
windows = _find_visible_windows_for_pids(pids)
if not windows:
return None
pid, hwnd, title = windows[0]
try:
user32.ShowWindow(hwnd, SW_RESTORE)
user32.BringWindowToTop(hwnd)
user32.SetForegroundWindow(hwnd)
except Exception:
pass
return pid, hwnd, title
def _wait_for_pids_exit(pids: list[int], timeout_seconds: float = 5.0) -> list[int]:
deadline = time.time() + timeout_seconds
remaining = set(pids)
@@ -449,6 +495,21 @@ class SoftwareControl(BaseTool):
)
if action == "open":
running_pids = _find_running_pids(best_record)
chat_process_names = _chat_app_process_names(query, best_record)
if chat_process_names:
running_pids = sorted(set(running_pids + _find_pids_for_process_names(chat_process_names)))
existing_window = _activate_existing_window_for_pids(running_pids)
if existing_window:
pid, hwnd, title = existing_window
return (
f"Switched to existing software window: {best_record.display_name}\n"
f"Match score: {best_score:.2f}\n"
f"PID: {pid}\n"
f"Window title: {title}\n"
f"Window handle: {hwnd}\n"
"Note: an existing visible window was detected, so the shortcut was not launched again."
)
try:
opened_target = _open_record(best_record)
except Exception as exc:
+16
View File
@@ -121,6 +121,22 @@ def _load_config() -> dict:
return {}
def reload_config() -> dict:
"""实时重载 env_config.json 配置,刷新所有模块级常量。
可在不重启进程的情况下重新读取配置文件,更新 GROUNDING_WIDTH 等运行时参数。
注意:调用方需通过 ``import agent.utils.env_utils as env_utils`` 然后访问
``env_utils.GROUNDING_WIDTH`` 才能获取到更新后的值,直接 ``from ... import``
的方式会绑定旧值。
输出:
加载到的配置字典,失败时返回空字典。
"""
result = _load_config()
_refresh_globals()
return result
_load_config()
_refresh_globals() # 确保无论配置加载成功与否,都有默认值
Binary file not shown.
Binary file not shown.
+104
View File
@@ -1209,6 +1209,17 @@ body {
cursor: not-allowed;
}
.btn-pause {
background: linear-gradient(165deg, #f59e0b, #d97706);
border-color: rgba(217, 119, 6, 0.85);
color: #fff;
box-shadow: 0 4px 14px rgba(245, 158, 11, 0.35);
}
.btn-pause:hover:not(:disabled) {
background: linear-gradient(165deg, #fbbf24, #f59e0b);
}
.btn-secondary {
background: rgba(255, 255, 255, 0.35);
}
@@ -2034,6 +2045,7 @@ body {
.model-table .col-name { flex: 1.5; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; color: #1e293b; }
.model-table .col-model { flex: 1.2; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #475569; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.78rem; }
.model-table .col-url { flex: 2.5; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #94a3b8; font-size: 0.72rem; }
.model-table .col-think { flex: 0 0 52px; text-align: center; font-size: 0.72rem; font-weight: 600; }
.model-table .col-actions { flex: 0 0 90px; display: flex; gap: 0.35rem; justify-content: flex-end; align-items: center; }
/* 表格内操作按钮 */
@@ -2119,6 +2131,13 @@ body {
gap: 0.5rem;
}
.toggle-hint {
font-size: 0.72rem;
color: #94a3b8;
margin-left: 0.35rem;
vertical-align: middle;
}
.toggle-row .toggle-label {
font-size: 0.82rem;
font-weight: 600;
@@ -2374,6 +2393,91 @@ body {
opacity: 0.92;
}
/* ===== 反思(think)面板 ===== */
.think-indicator {
margin-top: 0.35rem;
padding: 0.25rem 0;
border-top: 1px solid rgba(148, 163, 184, 0.10);
cursor: pointer;
user-select: none;
-webkit-user-select: none;
}
.think-indicator-icon {
font-size: 0.8rem;
}
.think-indicator-text {
font-size: 0.72rem;
color: rgba(100, 116, 139, 0.55);
font-weight: 400;
letter-spacing: 0.02em;
transition: color 0.3s;
}
.think-indicator:hover .think-indicator-text {
color: rgba(100, 116, 139, 0.75);
}
.think-list-wrap {
display: none;
margin-top: 0.15rem;
max-height: 220px;
overflow-y: auto;
padding: 0.15rem 0;
border-top: 1px solid rgba(148, 163, 184, 0.06);
}
.think-list-wrap--expanded {
display: block;
}
.think-item {
padding: 0.18rem 0.3rem;
border-radius: 4px;
font-size: 0.7rem;
color: rgba(51, 65, 85, 0.48);
line-height: 1.35;
transition: color 0.3s;
}
.think-item:hover {
background: rgba(148, 163, 184, 0.05);
}
.think-item-summary {
display: flex;
align-items: center;
gap: 0.2rem;
}
.think-bullet {
color: rgba(100, 116, 139, 0.40);
font-size: 0.65rem;
}
.think-label {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.think-item-detail {
margin-top: 0.3rem;
padding: 0.35rem 0.45rem;
background: rgba(148, 163, 184, 0.06);
border-radius: 4px;
font-size: 0.68rem;
line-height: 1.5;
color: rgba(51, 65, 85, 0.55);
white-space: pre-wrap;
word-break: break-word;
max-height: 200px;
overflow-y: auto;
font-family: inherit;
}
.todo-list-overlay {
position: fixed;
top: 80px;
+183 -9
View File
@@ -39,6 +39,7 @@
/** @type {File[]} */
let pendingFiles = [];
let sending = false;
let abortController = null;
let mediaRecorder = null;
let recorderStream = null;
let recordedChunks = [];
@@ -1171,6 +1172,93 @@
// ===== 工具调用展示(chat 视图 / 持久化) =====
let liveToolCallExpanded = false;
let thinkExpanded = false;
/** 在思考气泡内渲染反思(think)面板 */
function injectThinkPanel(typingEl, reflections) {
if (!typingEl) return;
const bubble = typingEl.querySelector(".msg-bubble") || typingEl;
// 反思指示器
let thinkIndicator = bubble.querySelector(".think-indicator");
if (!thinkIndicator) {
thinkIndicator = document.createElement("div");
thinkIndicator.className = "think-indicator";
thinkIndicator.title = "点击展开/收起 Agent 反思内容";
thinkIndicator.style.display = "none";
// 插入到 agent-running-indicator 前面
const runningIndicator = bubble.querySelector(".agent-running-indicator");
if (runningIndicator) {
bubble.insertBefore(thinkIndicator, runningIndicator);
} else {
bubble.appendChild(thinkIndicator);
}
thinkIndicator.addEventListener("click", () => {
thinkExpanded = !thinkExpanded;
const wrap = bubble.querySelector(".think-list-wrap");
if (wrap) wrap.classList.toggle("think-list-wrap--expanded", thinkExpanded);
updateThinkIndicatorText(thinkIndicator, reflections);
});
}
if (!reflections || !reflections.length) {
thinkIndicator.style.display = "none";
const wrap = bubble.querySelector(".think-list-wrap");
if (wrap) wrap.remove();
return;
}
thinkIndicator.style.display = "";
updateThinkIndicatorText(thinkIndicator, reflections);
// 反思列表容器
let listWrap = bubble.querySelector(".think-list-wrap");
if (!listWrap) {
listWrap = document.createElement("div");
listWrap.className = "think-list-wrap" + (thinkExpanded ? " think-list-wrap--expanded" : "");
// 插入到 think-indicator 后面
thinkIndicator.insertAdjacentElement("afterend", listWrap);
}
listWrap.classList.toggle("think-list-wrap--expanded", thinkExpanded);
// 增量更新列表项
const existingCount = listWrap.querySelectorAll(".think-item").length;
if (reflections.length <= existingCount) return; // 无新增
for (let i = existingCount; i < reflections.length; i++) {
const ref = reflections[i];
const item = document.createElement("div");
item.className = "think-item";
// 摘要行
const summary = document.createElement("div");
summary.className = "think-item-summary";
summary.innerHTML = `<span class="think-bullet">•</span> <span class="think-label">${escapeHtml(ref.summary || "反思")}</span>`;
item.appendChild(summary);
// 存储完整内容
item._thinkContent = ref.content || "";
// 点击展开完整内容
item.style.cursor = "pointer";
item.addEventListener("click", () => {
let detail = item.querySelector(".think-item-detail");
if (detail) {
detail.remove();
item.setAttribute("aria-expanded", "false");
return;
}
detail = document.createElement("pre");
detail.className = "think-item-detail";
detail.textContent = item._thinkContent;
item.appendChild(detail);
item.setAttribute("aria-expanded", "true");
});
listWrap.appendChild(item);
}
}
function updateThinkIndicatorText(indicator, reflections) {
const count = reflections ? reflections.length : 0;
indicator.innerHTML = `<span class="think-indicator-icon">🧠</span> <span class="think-indicator-text">think (${count})${thinkExpanded ? " ▾" : " ▸"}</span>`;
}
/** 在思考气泡内更新工具调用指示器与列表(增量更新,不重建 DOM) */
function injectLiveToolCalls(typingEl, liveCalls) {
@@ -1552,6 +1640,43 @@
renderMessages(data.messages);
}
function setSendBtnPauseMode(pauseMode) {
if (!sendBtn) return;
if (pauseMode) {
sendBtn.textContent = "暂停";
sendBtn.classList.add("btn-pause");
} else {
sendBtn.textContent = "发送";
sendBtn.classList.remove("btn-pause");
}
}
async function handlePauseClick() {
if (!sessionId || !sending || !abortController) return;
if (!window.confirm("确认暂停当前任务?\n\n暂停后当前对话将恢复到上一条消息的状态,工具调用记录和TodoList将被清空。")) return;
// 1. 调用后端 abort
try {
const fd = new FormData();
fd.append("session_id", sessionId);
const data = await api("/api/chat/abort", { method: "POST", body: fd });
sessionId = data.sessionId;
sessions = data.sessions || [];
clearTodoOverlay();
renderSessions();
renderMessages(data.messages || []);
} catch (e) {
// 回退:至少恢复 priorMessages
}
// 2. 取消前端 fetch
if (abortController) {
abortController.abort();
abortController = null;
}
sending = false;
setSendBtnPauseMode(false);
sendBtn.disabled = false;
}
async function sendChat() {
if (!sessionId || sending) return;
const trimmed = textInput.value.trim();
@@ -1565,6 +1690,9 @@
const blobUrls = [];
const hadOptimisticMedia = savedFiles.length > 0;
// 切换发送按钮为暂停按钮
setSendBtnPauseMode(true);
if (hadOptimisticMedia) {
const fileParts = savedFiles.map((f) => {
const kind = inferUploadKind(f);
@@ -1585,6 +1713,7 @@
renderAttachmentChips();
}
abortController = new AbortController();
const fd = new FormData();
fd.append("session_id", sessionId);
fd.append("text", trimmed);
@@ -1608,17 +1737,24 @@
// 清空上轮工具调用状态(新 turn)
liveToolCallExpanded = false;
thinkExpanded = false;
clearTodoOverlay();
// 启动实时工具调用轮询(增量更新,低频率不卡)
// 启动实时工具调用与反思轮询(增量更新,低频率不卡)
let livePollTimer = null;
let livePollActive = true;
const pollLiveToolCalls = async () => {
if (!livePollActive) return;
try {
const liveData = await api(`/api/tool-calls/${encodeURIComponent(sessionId)}/live`);
if (liveData.tool_calls && liveData.tool_calls.length > 0 && typingEl) {
injectLiveToolCalls(typingEl, liveData.tool_calls);
if (typingEl) {
// 先更新 think 面板
const reflections = liveData.reflections || [];
injectThinkPanel(typingEl, reflections);
// 再更新工具调用列表
if (liveData.tool_calls && liveData.tool_calls.length > 0) {
injectLiveToolCalls(typingEl, liveData.tool_calls);
}
}
} catch { /* ignore */ }
if (livePollActive) livePollTimer = setTimeout(pollLiveToolCalls, 1200);
@@ -1643,7 +1779,7 @@
fd2.append("session_id", sessionId);
fd2.append("output_type", outputModeSelect ? outputModeSelect.value : "text");
fd2.append("agent_mode", agentModeSelect ? agentModeSelect.value : "agent");
const done = await api("/api/chat/complete", { method: "POST", body: fd2 });
const done = await api("/api/chat/complete", { method: "POST", body: fd2, signal: abortController.signal });
try {
const todoData = await api(`/api/todo-list/${encodeURIComponent(sessionId)}`);
@@ -1681,16 +1817,23 @@
}
} catch (e) {
revokeBlobUrlStack(blobUrls);
if (hadOptimisticMedia) {
if (e && e.name === "AbortError") {
// 用户点击了暂停 → 不显示错误,恢复 priorMessages
renderMessages(priorMessages);
} else if (hadOptimisticMedia) {
textInput.value = savedTextRaw;
pendingFiles = savedFiles.slice();
renderAttachmentChips();
renderMessages(priorMessages);
}
if (typingEl && typingEl.parentNode) typingEl.remove();
alert(e.message || String(e));
if (!(e && e.name === "AbortError")) {
alert(e.message || String(e));
}
} finally {
sending = false;
abortController = null;
setSendBtnPauseMode(false);
sendBtn.disabled = false;
}
}
@@ -1721,7 +1864,13 @@
}
});
sendBtn.addEventListener("click", sendChat);
sendBtn.addEventListener("click", () => {
if (sending) {
handlePauseClick().catch((e) => alert(e.message || String(e)));
} else {
sendChat();
}
});
micBtn?.addEventListener("click", () => toggleMicRecording().catch((e) => alert(e.message || String(e))));
autoInputCheck?.addEventListener("change", (ev) => toggleAutoInput(ev.target.checked));
clearBtn.addEventListener("click", () => clearChat().catch((e) => alert(e.message)));
@@ -2615,14 +2764,15 @@
table.className = "model-table";
const thead = document.createElement("div");
thead.className = "model-table-head";
thead.innerHTML = '<span class="col-name">名称</span><span class="col-model">Model</span><span class="col-url">Base URL</span><span class="col-actions" style="justify-content:flex-end;color:inherit;font-size:inherit;">操作</span>';
thead.innerHTML = '<span class="col-name">名称</span><span class="col-model">Model</span><span class="col-url">Base URL</span><span class="col-think">思考</span><span class="col-actions" style="justify-content:flex-end;color:inherit;font-size:inherit;">操作</span>';
table.appendChild(thead);
cachedModels.forEach((m, mi) => {
const row = document.createElement("div");
row.className = "model-table-row";
row.innerHTML = `<span class="col-name" title="${escapeHtml(m.name)}">${escapeHtml(m.name)}</span>
<span class="col-model" title="${escapeHtml(m.model)}">${escapeHtml(m.model)}</span>
<span class="col-url" title="${escapeHtml(m.base_url)}">${escapeHtml(m.base_url)}</span>`;
<span class="col-url" title="${escapeHtml(m.base_url)}">${escapeHtml(m.base_url)}</span>
<span class="col-think" style="text-align:center;">${m.enable_thinking ? '<span title="已启用思考" style="color:#f59e0b;">ON</span>' : '<span title="思考已关闭" style="color:#94a3b8;">OFF</span>'}</span>`;
const actions = document.createElement("span");
actions.className = "col-actions";
const editBtn = document.createElement("button");
@@ -2676,6 +2826,27 @@
modalFields[key] = inp;
modalBody.appendChild(div);
});
// 思考模式开关
const thinkingDiv = document.createElement("div");
thinkingDiv.className = "modal-field";
const thinkingLabel = document.createElement("label");
thinkingLabel.textContent = "思考模式";
const thinkingWrap = document.createElement("label");
thinkingWrap.className = "toggle-switch";
const thinkingCheckbox = document.createElement("input");
thinkingCheckbox.type = "checkbox";
const thinkingSlider = document.createElement("span");
thinkingSlider.className = "toggle-slider";
thinkingWrap.appendChild(thinkingCheckbox);
thinkingWrap.appendChild(thinkingSlider);
const thinkingHint = document.createElement("span");
thinkingHint.className = "toggle-hint";
thinkingHint.textContent = " 关闭后禁用模型思考(默认关闭,减少延迟)";
thinkingDiv.appendChild(thinkingLabel);
thinkingDiv.appendChild(thinkingWrap);
thinkingDiv.appendChild(thinkingHint);
modalFields["enable_thinking"] = thinkingCheckbox;
modalBody.appendChild(thinkingDiv);
modalBox.appendChild(modalBody);
const modalActions = document.createElement("div");
modalActions.className = "model-modal-actions";
@@ -2697,6 +2868,7 @@
base_url: modalFields.base_url.value.trim(),
timeout: parseFloat(modalFields.timeout.value) || 60,
max_retries: 0,
enable_thinking: modalFields.enable_thinking.checked,
};
if (!data.name || !data.model) { alert("名称和模型名不能为空"); return; }
if (editingModelIdx >= 0) {
@@ -2758,12 +2930,14 @@
fields.api_key.value = m.api_key || "";
fields.base_url.value = m.base_url || "";
fields.timeout.value = m.timeout || 60;
fields.enable_thinking.checked = !!m.enable_thinking;
} else {
fields.name.value = "";
fields.model.value = "";
fields.api_key.value = "";
fields.base_url.value = "";
fields.timeout.value = 60;
fields.enable_thinking.checked = false;
}
overlay.classList.add("show");
}
+1
View File
@@ -125,6 +125,7 @@
<label class="output-mode-label" for="agentModeSelect">Agent 模式</label>
<select id="agentModeSelect" class="output-mode-select" aria-label="Agent 工作模式">
<option value="agent">agent</option>
<option value="plan">plan</option>
<option value="team">team</option>
</select>
<!-- 自动语音输入开关 -->
+48 -4
View File
@@ -580,6 +580,47 @@ def api_chat_complete(
return _chat_complete_core(session_id, output_type=output_type, agent_mode=agent_mode)
@app.post("/api/chat/abort")
def api_chat_abort(session_id: str = Form(...)) -> dict[str, Any]:
"""中止当前正在执行的 Agent 任务,回滚到最后一条消息之前的状态。
输入:
session_id: 表单字段,会话 ID。
输出:
{"sessionId": str, "sessions": list[str], "messages": list[dict]}
"""
if not session_id:
raise HTTPException(status_code=400, detail="缺少 session_id")
try:
from agent.core.runtime import set_abort_flag
set_abort_flag(session_id)
except Exception:
pass
# 回滚 manifest:移除最后一条 user 消息及后续 assistant
hist = ui.load_ui_messages_for_session(session_id)
rolled_back = list(hist or [])
while rolled_back and rolled_back[-1].get("role") != "user":
rolled_back.pop()
if rolled_back:
rolled_back.pop()
ui.sync_manifest_from_chat_history(session_id, rolled_back, "")
# 清除 todo store
try:
from agent.tools.tool import clear_todo_store_session
clear_todo_store_session(session_id)
except Exception:
pass
ids = ui.list_session_ids_ordered()
if session_id not in ids:
ids = [session_id, *ids]
return {
"sessionId": session_id,
"sessions": ids,
"messages": _serialize_messages(rolled_back, session_id),
}
@@ -859,12 +900,15 @@ def api_reload_configs() -> dict[str, Any]:
# ---------- 工具调用历史 API ----------
@app.get("/api/tool-calls/{session_id}/live")
def api_get_live_tool_calls(session_id: str) -> dict[str, Any]:
"""获取当前进行中的工具调用(前端执行期间实时轮询)。"""
"""获取当前进行中的工具调用与反思内容(前端执行期间实时轮询)。"""
try:
from agent.history.tool_call_recorder import get_live_tool_calls
return {"tool_calls": get_live_tool_calls(session_id)}
from agent.history.tool_call_recorder import get_live_tool_calls, get_live_reflections
return {
"tool_calls": get_live_tool_calls(session_id),
"reflections": get_live_reflections(session_id),
}
except Exception as e:
return {"tool_calls": [], "error": str(e)}
return {"tool_calls": [], "reflections": [], "error": str(e)}
@app.get("/api/tool-image")