每天都有可以期待更美好的事情即将发生,又有更好的工具出现,又可以更加全方位的帮助自己做更多自己以前不会的事情,超方便 4 个帖子 - 4 位参与者 阅读完整话题
懒猫微服直播来了(明天中午 12:30-13:30 ) 工程师面对面,带您全方位了解懒猫微服 有什么问题尽管问,快来预约微信视频号直播吧!!
本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 以下为项目介绍正文内容,AI生成、润色内容已使用截图方式发出 前言 今年2月份的时候,心血来潮,开坑了一个 在线简历 的开源项目,虽然简历项目已经够多了,但是自己还是决定试着做一下,主要有以下几点原因: 有些想要的功能市面上的简历工具没有:比如一键隐私打码,根据工作经历自动推算工作年限等等 简历项目看着简单,就是几个网页,模块拖拽编辑点点点嘛(实际做了才发现没有那么简单) 适合作为第一次vibe coding来练手的小型项目 项目仓库 GitHub AI使用情况 Claude Code:主力使用,来源主要是靠any大善人,永远的神,虽然中间有一段时间用不了,但绝大部分还是靠它。 Gemini 3.1 Pro:谷歌账号家庭组的车,在网页里使用,主要是写前端的demo,确定组件UI的交互逻辑,毕竟谷歌自家就是做浏览器的,前端这块没话说。 GPT 5.4:来源冰佬的公益站,那段时间opus风控严重,全靠冰佬的公益站渡过难关,主要处理非常明确的需求,排查bug等等。 实战 项目冷启动 一开始我并没有规划好项目的功能,先克隆了 visiky/resume: 在线简历生成器 这个项目,让AI帮我分析项目架构,技术栈,生成了一个文档。我把文档复制到自己的项目中,让AI评估,使用plan模式,重新分析和选择技术栈,流程还是参考之前的。这里现在看来感觉有些多余了,没必要,完全可以自己从零规划,不参考老项目。让AI做更现代化的架构规划,效率更高。 迭代:UI打磨 第一次vibe coding,经验不足,总是走一步看一步,让AI慢慢帮我新加功能,没有在一开始就规划好核心功能,导致数据结构经常变化,结构一变化,项目就得重构。 做的过程,会体验很多优秀的简历项目,比如Reactive Resume,魔方简历等,一个功能该不该做,怎么做,除了问AI,更多的是自己作为用户,去实际体验,然后考虑当前功能在现在阶段是必要的吗 每次新加了功能,总觉得不对劲,但又说不上哪里不对劲,这时我就会把问题抛给Gemini,让他帮我审核,交互有问题的地方,让他直接出一个HTML文件给我,我来体验。 比如觉得卡片样式不好看,给demo 头像选择框不好看,给demo 编辑器不好看,给demo (注:以上这些都是可以交互的网页,因为主题里不能发HTML文件,就只截了个图) 前前后后我大概生成了20多个网页demo,用来确认界面UI交互逻辑。 所以我这个项目的界面还真算的上是精雕细琢过的 “幽灵行”交互 在用户基本信息中,有一个可以自定义添加字段的功能,比如添加GitHub地址,博客地址等等,最开始我设计的是点一个加号,新出一行,但是这样用户可以一直点加号,出现很多空白字段但是不填写,我觉得这样是有问题的。于是问Gemini,它给了一个我之前从未听过的方案:“幽灵行” 也就是填完一行内容,鼠标焦点丢失,才出现新的一行,有效的避免了可以无限新增空白行的问题。呐,新知识Get 后续就是项目慢慢更新,遵循 one commit, one thing的原则,到写这篇帖子的时候,有157次提交。 神器安利 强烈安利一个插件 Agentation ,可以在本地开发页面时,直接在页面上选择元素,输入需求,再一键复制给AI,包含精确定位的需求,AI在执行时,能剩下很多搜索的时间和token,也避免我们在描述时,很容易出现不准确的问题,再也不用说 “帮我把导入PDF确认对话框右下角那个确认按钮改一下” 了。 开发总结 AI开发过程的内容大概就这么多了,之前踩坑的地方是走一步看一步,没有先做好整体的规划。后续的AI项目开发,我应该会先写前端demo,借着demo思考功能,页面完善之后,再让AI根据前端代码来写后端,前端本身就是最好的项目需求文档。 (狗头) 运营 有句话怎么说的来着:“ 实现产品不是最难的,最难的是把产品推销出去 ”。 现在是真真切切的体验到了这段话,我主要在L站宣传,以及会被一些个人网站收录,推特上的资源号推荐,断断续续涨了100多star,现在是涨不动了,两天能有一个都算好的,真的希望项目能被更多的人使用,对更多的人有帮助。 直接说说踩过的坑 产品命名 一开始项目名称是 OpResume,在L站的帖子都是用的这个,在Google中搜索还是能搜到的,但是这个名称很不利于传播,别人怎么说呢?我在用的那个欧什么啊耳的简历网站,还不错,可以试试。 后来才补的中文名:优派简历(“有派”的谐音) 但是前期推广已经做了,GitHub项目改名,文章改名都比较麻烦,重新推广效果一般,现在搜索引擎也搜不到。 血的教训 :如果你的产品目标用户是大众群体,不是仅面向程序员群体的,那么一个朗朗上口的中文名比单纯的英文名一定是更有利的传播的。 落地页的重要性 同样的,项目在开始推广时是没有产品落地页的,但你的产品目标用户是大众群体,你无法让大部分用户都去你的GitHub项目上了解产品特性,有什么好用的功能。当用户第一次打开时,直接是一个简历编辑界面,你让用户自己探索,虽然这样看着很“极简”,但我想大部分用户应该是懵逼的,这样会流失不少用户。 后来才补上了产品的落地页,向第一次使用产品的用户介绍自己。 加上了产品落地页后,项目用户的自然增长比之前好了很多,不再是一周 0 star 的惨烈状态了。 社群 在L站发帖的时候,还没有需要建立交流群的意识,也是怕在项目中加上了入群的邀请链接,会被认定为引流,拉私域。 想的是项目到了100star以后,再建群慢慢拉人,殊不知自己已经错过了最宝贵的100个种子用户,前期项目需要快速迭代的时候,无法听见大部分普通用户的声音,只有一两个人会在GitHub上反馈问题。 现在项目主要功能都更新完了,已有的功能好不好用?不知道。哪些功能用户最需要?不知道。目前已经迷失了方向。有2周没有更新了。 Logo 做logo真的让人头疼,自己没有思路,靠AI抽奖的话,有时那是真的抽象。 优派简历的logo我自己还是比较满意,也踩了很多坑。 这里分享一些小技巧,比如我的项目名称是优派简历,我想要做一个由字母y和p组成的logo,但是没有头绪。 我直接Google搜索"yp letter logo",就会有一些logo图标给你提供灵感 有了大致图形后,你把需求给gpt-image-2出图,然后多次调整修改就好了。 比如我最后灵机一动,把logo的结尾改成了领带形状,注入“职场,简历”的属性。一个logo就诞生了。 结语 以上就是vibe完一个开源项目,从开发到推广的踩坑以及经验总结,希望能对各位佬友有所帮助。如果对项目有好的建议也欢迎留言,最后厚着脸皮打一个广告,欢迎大家来使用 优派简历 2 个帖子 - 2 位参与者 阅读完整话题
脚本简介 这是一个专为 Linux.do 论坛 设计的用户脚本,旨在提供干净、极简、功能增强的浏览体验。它通过隐藏干扰元素、折叠置顶话题以及添加便捷导航面板,让你专注于内容阅读,而不被广告、横幅和公告打扰。 主要功能 界面净化 自动隐藏论坛顶部的搜索横幅。 移除全局公告栏和欢迎横幅。 折叠置顶话题,减少列表占用空间,同时可一键展开查看。 智能置顶话题管理 显示折叠/展开置顶话题的按钮,并记录用户偏好。 支持动态刷新,自动适应新加载的置顶话题。 可通过按钮快速切换显示状态。 iOS 风格导航面板 固定在页面右下角的毛玻璃浮动面板。 面板包含: 回到顶部:滚动到页面顶部并记录当前位置。 返回原位 / 页尾:快速回到之前滚动的位置或页面底部。 支持浅色/深色模式自适应,具备悬停、点击动画效果。 眼睛保护平滑滚动 滚动过程中自动添加遮罩,减少闪烁和突变。 提供平滑过渡动画,保护视觉体验。 CloudFlare Challenge 自动跳转 当访问受 CloudFlare 保护的页面时,检测错误提示并自动重定向至 Challenge 页面。 提供菜单命令手动触发跳转,确保论坛访问不中断。 实时监控与自动刷新 使用 MutationObserver 实时监控页面变化。 当页面元素变动或新内容加载时,自动重新渲染导航面板和置顶话题。 使用方法 安装用户脚本管理器(如 Tampermonkey、Violentmonkey)。 新建脚本,将代码粘贴进去。 保存并访问 https://linux.do/ 即可生效。 可通过右键扩展菜单或脚本菜单手动触发 CloudFlare Challenge 跳转。 // ==UserScript== // @name Linux.do - 论坛全方位净化导航 // @namespace https://linux.do/ // @version 1.0 // @description 隐藏搜索横幅 + 移除全局公告栏 + 折叠置顶话题 // @author // @match https://linux.do/* // @grant GM_addStyle // @grant GM_registerMenuCommand // @run-at document-start // @license MIT // ==/UserScript== GM_addStyle(` :root { --ios-panel-width: 44px; --ios-panel-radius: 24px; --ios-btn-width: 36px; --ios-btn-height: 36px; --ios-blur: blur(35px) saturate(220%); --ios-border: 1px solid rgba(255, 255, 255, 0.45); } #main-outlet > div[class*="welcome-banner"], #main-outlet > div.--location-above-topic-content, div.custom-search-banner-wrap.welcome-banner__wrap, div[data-component="welcome-banner"], div.global-notice { display: none !important; } .topic-list-item.pinned, tr.pinned, .latest-topic-list-item.pinned { background-color: var(--secondary, #ffffff) !important; } .dark-mode .topic-list-item.pinned, .dark-mode tr.pinned, .dark-mode .latest-topic-list-item.pinned { background-color: var(--secondary, #111111) !important; } .topic-list-body tr.pinned, .topic-list tbody tr.pinned, table.topic-list tbody tr.pinned { display: none !important; } html.ld-pinned-expanded .topic-list-body tr.pinned, html.ld-pinned-expanded .topic-list tbody tr.pinned, html.ld-pinned-expanded table.topic-list tbody tr.pinned { display: table-row !important; } tr.linux-do-pinned-toggle-row td { padding: 12px; border-bottom: 1px solid var(--primary-low, #e9ecef); background: var(--secondary, #fff); } .linux-do-pinned-toggle-button { padding: 0; border: 0; background: transparent; color: var(--tertiary, #0ea5e9); font-size: 14px; font-weight: 600; cursor: pointer; } .linux-do-pinned-toggle-button:hover { text-decoration: underline; } #ld-nav-panel { position: fixed; right: 20px; bottom: 140px; z-index: 99999; width: var(--ios-panel-width); padding: 8px 0; display: flex; flex-direction: column; align-items: center; gap: 8px; border: var(--ios-border); border-radius: var(--ios-panel-radius); background: rgba(255, 255, 255, 0.42); -webkit-backdrop-filter: var(--ios-blur); backdrop-filter: var(--ios-blur); box-shadow: 0 12px 36px rgba(0, 0, 0, 0.08); } #ld-nav-panel.ld-nav-hidden { display: none !important; } .ld-nav-btn { width: var(--ios-btn-width); height: var(--ios-btn-height); border: none; border-radius: 50%; background: transparent; cursor: pointer; display: flex; align-items: center; justify-content: center; color: rgba(0, 0, 0, 0.7); transition: background 0.1s ease, color 0.1s ease; } .ld-nav-btn:hover { color: #000000; background: rgba(0, 0, 0, 0.06); } .ld-nav-btn:active { background: rgba(0, 0, 0, 0.12); } .dark-mode #ld-nav-panel { background: rgba(28, 28, 30, 0.45); border: 1px solid rgba(255, 255, 255, 0.15); box-shadow: 0 12px 36px rgba(0, 0, 0, 0.4); } .dark-mode .ld-nav-btn { color: rgba(255, 255, 255, 0.8); } .dark-mode .ld-nav-btn:hover { color: #ffffff; background: rgba(255, 255, 255, 0.12); } .dark-mode .ld-nav-btn:active { background: rgba(255, 255, 255, 0.18); } html.ld-scroll-locked { overflow: hidden !important; } #ld-eye-protection-mask { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; z-index: 999999; opacity: 0; pointer-events: none; transform: translate3d(0, 0, 0); background: radial-gradient(circle at center, rgba(255, 255, 255, 0.35) 0%, rgba(232, 241, 255, 0.65) 100%); -webkit-backdrop-filter: blur(0px) saturate(100%); backdrop-filter: blur(0px) saturate(100%); will-change: opacity, backdrop-filter, -webkit-backdrop-filter; transition: opacity 0.2s ease, backdrop-filter 0.2s ease, -webkit-backdrop-filter 0.2s ease; } .dark-mode #ld-eye-protection-mask { background: radial-gradient(circle at center, rgba(14, 14, 17, 0.6) 0%, rgba(24, 25, 33, 0.8) 100%); } #ld-eye-protection-mask.mask-entering { opacity: 1; pointer-events: auto; -webkit-backdrop-filter: blur(55px) saturate(240%); backdrop-filter: blur(55px) saturate(240%); } #ld-eye-protection-mask.mask-leaving { opacity: 0; pointer-events: none; -webkit-backdrop-filter: blur(0px) saturate(100%); backdrop-filter: blur(0px) saturate(100%); transition: opacity 0.22s ease, backdrop-filter 0.22s ease, -webkit-backdrop-filter 0.22s ease; } html.ld-scroll-locked .d-header, html.ld-scroll-locked .d-header * { transition: none !important; animation: none !important; opacity: 0 !important; visibility: hidden !important; pointer-events: none !important; } `); (() => { 'use strict'; var CF_CONFIG = { ERROR_TEXTS: ['403 error', '该回应是很久以前创建的', 'reaction was created too long ago', '我们无法加载该话题', 'You are not allowed to react'], DIALOG_SELECTOR: '.dialog-body', CHALLENGE_PATH: '/challenge', MENU_TEXT: '手动触发 Challenge 跳转', NOT_FOUND_REDIRECT_GUARD_KEY: 'linux_do_auto_challenge_nf_guard' }; if (globalThis.location.pathname.startsWith(CF_CONFIG.CHALLENGE_PATH)) { const isNotFoundPage = () => Boolean(document.querySelector('.page-not-found')); const getRedirectParamUrl = () => { try { const sp = new URLSearchParams(globalThis.location.search); const raw = sp.get('redirect'); if (!raw) return void 0; const url = new URL(raw, globalThis.location.origin); return url.origin === globalThis.location.origin ? url.href : void 0; } catch (e) { return void 0; } }; const redirectFromNotFoundPage = () => { const fallback = ''.concat(globalThis.location.origin, '/'); const target = getRedirectParamUrl() || fallback; const now = Date.now(); let guardTs = 0; try { const raw = sessionStorage.getItem(CF_CONFIG.NOT_FOUND_REDIRECT_GUARD_KEY); guardTs = raw ? Number(raw) : 0; } catch (e) {} if (guardTs && now - guardTs < 5e3) return; try { sessionStorage.setItem(CF_CONFIG.NOT_FOUND_REDIRECT_GUARD_KEY, String(now)); } catch (e) {} if (target === globalThis.location.href) { globalThis.location.replace(fallback); } else { globalThis.location.replace(target); } }; const runChallengeGuard = () => { if (isNotFoundPage()) redirectFromNotFoundPage(); }; if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', runChallengeGuard); } else { runChallengeGuard(); } return; } const SVG_ICONS = { top: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="18 15 12 9 6 15"/></svg>`, bottom: `<svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"/></svg>` }; const STORAGE_KEY = 'linux-do-collapse-pinned-topics'; const TOGGLE_ROW_CLASS = 'linux-do-pinned-toggle-row'; const TOGGLE_BUTTON_CLASS = 'linux-do-pinned-toggle-button'; let engineTimer = null, globalObserver = null; let lastRecordedY = null; function syncExpandedClass() { document.documentElement.classList.toggle('ld-pinned-expanded', window.localStorage.getItem(STORAGE_KEY) === 'expanded'); } syncExpandedClass(); function redirectToChallenge() { try { globalThis.location.href = ''.concat(CF_CONFIG.CHALLENGE_PATH, '?redirect=').concat(encodeURIComponent(globalThis.location.href)); } catch (error) {} } function checkAndRedirect() { try { const dialogElement = document.querySelector(CF_CONFIG.DIALOG_SELECTOR); if (!dialogElement) return false; const text = dialogElement.textContent || ''; if (CF_CONFIG.ERROR_TEXTS.some((errorText) => text.includes(errorText))) { if (globalObserver) globalObserver.disconnect(); redirectToChallenge(); return true; } } catch (error) {} return false; } function smoothScrollWithMask(targetY) { if (!document.body || targetY === null || targetY === undefined) return; document.documentElement.classList.add('ld-scroll-locked'); let mask = document.getElementById('ld-eye-protection-mask'); if (!mask) { mask = document.createElement('div'); mask.id = 'ld-eye-protection-mask'; document.body.append(mask); } mask.classList.remove('mask-leaving'); mask.classList.add('mask-entering'); if (mask.safetyTimer) clearTimeout(mask.safetyTimer); const forceCleanUp = () => { document.documentElement.classList.remove('ld-scroll-locked'); if (mask && mask.parentNode) mask.remove(); }; setTimeout(() => { window.requestAnimationFrame(() => { window.scrollTo({ top: targetY, behavior: 'auto' }); window.requestAnimationFrame(() => { window.requestAnimationFrame(() => { mask.classList.remove('mask-entering'); mask.classList.add('mask-leaving'); document.documentElement.classList.remove('ld-scroll-locked'); const onTransitionEnd = (e) => { if (e.propertyName === 'opacity' && mask.classList.contains('mask-leaving')) { forceCleanUp(); mask.removeEventListener('transitionend', onTransitionEnd); } }; mask.addEventListener('transitionend', onTransitionEnd); mask.safetyTimer = setTimeout(forceCleanUp, 350); }); }); }); }, 240); } function renderPinnedTopics() { const tableBody = document.querySelector('#list-area tbody.topic-list-body, #list-area .topic-list tbody, table.topic-list tbody, tbody.topic-list-body'); if (!tableBody) { const activeRow = document.querySelector(`tr.${TOGGLE_ROW_CLASS}`); if (activeRow) activeRow.remove(); return; } const pinnedRows = []; for (const row of Array.from(tableBody.children)) { if (row.tagName !== 'TR' || row.classList.contains(TOGGLE_ROW_CLASS)) continue; if (!row.classList.contains('pinned')) break; pinnedRows.push(row); } if (pinnedRows.length === 0) { const activeRow = document.querySelector(`tr.${TOGGLE_ROW_CLASS}`); if (activeRow) activeRow.remove(); return; } const firstRow = tableBody.querySelector('tr:not(.linux-do-pinned-toggle-row)'); const colCount = firstRow ? firstRow.cells.length : 5; let toggleRow = tableBody.querySelector(`:scope > tr.${TOGGLE_ROW_CLASS}`); if (!toggleRow) { toggleRow = document.createElement('tr'); toggleRow.className = TOGGLE_ROW_CLASS; toggleRow.innerHTML = `<td colspan="${colCount}"><button type="button" class="${TOGGLE_BUTTON_CLASS}"></button></td>`; tableBody.insertBefore(toggleRow, pinnedRows[0]); } else { const td = toggleRow.querySelector('td'); if (td && td.getAttribute('colspan') !== String(colCount)) td.setAttribute('colspan', colCount); } const button = toggleRow.querySelector(`button.${TOGGLE_BUTTON_CLASS}`); if (button) { button.textContent = `${window.localStorage.getItem(STORAGE_KEY) !== 'expanded' ? '显示' : '折叠'}置顶话题 (${pinnedRows.length})`; } } function processNavPanel() { if (!document.body) return; let panel = document.getElementById('ld-nav-panel'); if (!panel) { panel = document.createElement('div'); panel.id = 'ld-nav-panel'; panel.className = 'ld-nav-hidden'; const buttons = [ { action: 'top', title: '回到顶部(记录原坐标)', svg: SVG_ICONS.top }, { action: 'bottom', title: '返回原位 / 未读分割线 / 去页尾', svg: SVG_ICONS.bottom } ]; for (const b of buttons) { const btn = document.createElement('button'); btn.className = 'ld-nav-btn'; btn.setAttribute('data-action', b.action); btn.title = b.title; btn.setAttribute('aria-label', b.title); btn.innerHTML = b.svg; panel.append(btn); } document.body.append(panel); } panel.classList.toggle('ld-nav-hidden', !document.querySelector('#topic-title, .topic-navigation, .posts-section')); } function handleBottomClick() { if (lastRecordedY !== null) { smoothScrollWithMask(lastRecordedY); lastRecordedY = null; } else { const unreadBar = document.querySelector('.unread-highlighter, .topic-avatar.unread'); if (unreadBar) { smoothScrollWithMask(unreadBar.getBoundingClientRect().top + window.scrollY - 100); } else { smoothScrollWithMask(document.documentElement.scrollHeight); } } } function executeEngine() { const notice = document.querySelector('div.global-notice'); if (notice) notice.remove(); processNavPanel(); renderPinnedTopics(); } document.addEventListener('click', (e) => { const btn = e.target.closest('.ld-nav-btn'); if (btn) { const action = btn.getAttribute('data-action'); if (action === 'top') { lastRecordedY = window.scrollY; smoothScrollWithMask(0); } else if (action === 'bottom') { handleBottomClick(); } return; } if (e.target.classList.contains(TOGGLE_BUTTON_CLASS)) { window.localStorage.setItem(STORAGE_KEY, window.localStorage.getItem(STORAGE_KEY) !== 'expanded' ? 'expanded' : 'collapsed'); syncExpandedClass(); executeEngine(); } }); (() => { try { globalObserver = new MutationObserver((mutations) => { let hasValidChange = false; let hasNewNodes = false; for (const m of mutations) { if (m.target.id === 'ld-eye-protection-mask' || m.target.id === 'ld-nav-panel' || m.target.className === TOGGLE_ROW_CLASS) continue; hasValidChange = true; if (m.addedNodes.length > 0) hasNewNodes = true; } if (!hasValidChange) return; if (hasNewNodes && checkAndRedirect()) return; if (engineTimer) clearTimeout(engineTimer); engineTimer = setTimeout(executeEngine, 40); }); globalObserver.observe(document.documentElement, { childList: true, subtree: true, characterData: true }); } catch (error) {} try { GM_registerMenuCommand(CF_CONFIG.MENU_TEXT, redirectToChallenge); } catch (error) {} executeEngine(); checkAndRedirect(); })(); })(); 4 个帖子 - 4 位参与者 阅读完整话题
IT之家 5 月 19 日消息,特斯拉正全方位持续打磨优化其 Robotaxi 自动驾驶出租车项目,如今还将对配套生态中的手机应用进行大更新。 特斯拉计划借着 Robotaxi 应用 26.4.5 版本的推送完成此次重大调整,该版本近期已被社交平台 X 上的特斯拉应用更新博主反编译解析。此次更新新增大量核心代码,主要围绕远程操控、安全管控机制以及无缝化自动驾驶约车服务展开。 种种优化举措表明,特斯拉正为大规模投放无人监管版 Cybercab 做足准备,尤其是量产阶段已现身的无方向盘车型。本次功能升级重在打造稳定可靠的出行体验,既能在乘客有需求时及时提供协助,也能大幅提升整体运营效率。 本次更新一大亮眼新增功能为远程调度员语音通话。应用内置专属原生语音通话系统,乘客可通过车内麦克风与音响,直接连线特斯拉远程运营专员。 乘车途中遇到路线疑问、车内舒适调节等问题时,乘客可实时寻求人工协助,全程不会打断车辆自动驾驶行驶流程。该功能在原有应急协助机制基础上,让人工介入变得更便捷、操作更直观。 主动式远程协助 新版应用还将上线主动远程协助能力。系统不再被动等待乘客求助,而是可通过实时监测车况与路况,主动预判需求并提供帮助。 例如主动建议调整行驶路线、调节车内空调温度、提前规避行程延误等。特斯拉结合人工智能智能监测与人工后台监管,力求打造比传统网约车服务更顺畅、贴心的出行服务。 无方向盘 Cybercab:人工临时接管 + 远程启动 针对无方向盘 Cybercab 车队,此次更新新增人工权限接管与远程启动核心功能。车队运营人员及维修技师可临时接管车辆控制权,或是远程启动这类无方向盘车型。该功能多用于低速场景操作,比如驶出狭窄停车位、车辆维保作业等。 出于安全考量,人工接管行驶速度严格限制在 2 英里(IT之家注:约 3.2 公里) / 小时以内,仅作为应急处置手段使用。 特斯拉还增设加密的手动驾驶启用模式,授权相关工作人员临时掌控车辆。除此之外,远程启动功能可让空载车辆自主开启无人驾驶接单行程。 约车派单相关功能 约车派单功能全面升级,新增柔性派单与多站点行程支持。应用可智能匹配乘客与空闲 Cybercab ,还支持单次行程途经多个目的地。 此举能提升车队利用率、缩短乘客候车时长,大幅优化拼车出行效率。柔性派单模式会综合考量距离远近、乘客出行偏好、车辆空余状态等因素,进一步提升用户出行体验。 乘客端应用车内同步、实时路线规划 全新联动同步功能上线,乘客可直接在手机端同步操控并调节车内座椅、空调、影音娱乐等车载设置。路线规划可根据实时路况、道路状况动态更新,同时系统持续开展全域安全环境监测。 手机应用可直接向车辆中控屏推送指令、实现中控屏联动操控;专属导航协议还能精准同步道路封闭、道路施工等精准坐标信息,避免车辆被困,减少人工应急接管频次。 多项功能互联互通,实现车辆与手机应用高效协同、响应迅速。 紧急断行关停开关 特斯拉配备高安全等级的车辆紧急停驶指令,可一键彻底锁死车辆行驶权限。特斯拉可依据各类管控需求,将车辆直接移出 Robotaxi 运营车队;即便持有合法钥匙等正规设备,也无法为车辆挂挡启动。
36氪获悉,近日,网易有道宣布“子曰”大模型迎来4.0版本的全方位升级。“子曰4"正式迈入全模态时代,不仅全面支持文本、图片、音频的融合交互,有道更宣布将核心的“多模态模型”与“语音合成(TTS)模型”正式开源。
据报道,YouTube借助人工智能帮助,正向各类广告主承诺全方位服务。(财联社)