const{createApp}=Vue const{createVuetify,useGoTo,useDisplay}=Vuetify var data={alert:{show:false,color:'success',text:'',timeout:0,},theme:{dark:false,},nav:{showDrawer:false,showTOC:true,tocPanel:0,tab:'account',post:{discussionId:3448,currentPage:1,targetPage:1,total:3,anchor:0,goToOptions:{container:null,duration:0,easing:'easeInOutCubic',offset:-100,},worker:null,task:[],active:[],apiLock:[],originLike:new Map([]),},related:{block:1,}},search:{width:80,text:null,loading:false,},tags:[{id:61,url:'/t/6b3d071d6a045c7161770a094610',name:'Gemma',color:'#66BB6A',icon:'mdi-tag-heart',},],posts:[{id:40786,num:0,uid:209,content:'Introducing Gemma 3: The Future of AI Development\u003Cp\u003EWelcome to the world of Gemma 3, Google\u0026#39;s latest and most advanced iteration in the Gemma family of models. With over 100 million downloads and a vibrant community creating 60,000+ variants, Gemma 3 builds on this success with groundbreaking features and capabilities. Discover more about Gemma 3 and explore its potential at gemma-3.net.\u003C/p\u003EUnveiling New Capabilities\u003Cp\u003EGemma 3 introduces multimodality, supporting both vision-language inputs and text outputs. With a context window of up to 128k tokens and support for over 140 languages, Gemma 3 enhances math, reasoning, and chat capabilities. Available in four sizes, from 1B to 27B parameters, these models are perfect for a range of applications. Learn more about these features at gemma-3.net.\u003C/p\u003ETechnical Innovations\u003Cp\u003EGemma 3\u0026#39;s development involved optimized pre-training and post-training processes, using distillation, reinforcement learning, and model merging. This results in superior performance in math, coding, and instruction following. The model also includes a new tokenizer for improved multilingual support. Dive into the technical details at gemma-3.net.\u003C/p\u003EGet Started with Gemma 3\u003Cp\u003EReady to explore Gemma 3? Use Google AI Studio for quick experimentation, download models from Hugging Face or Kaggle, and integrate them into your projects using popular tools like Hugging Face Transformers or PyTorch. With multiple deployment options, including Google GenAI API, Vertex AI, and Cloud Run, you can choose the best fit for your needs. Gemma 3 is designed to be accessible and efficient, running seamlessly on devices from phones to workstations.\u003C/p\u003EEnhanced Safety and Accessibility\u003Cp\u003EGemma 3 includes rigorous safety protocols and the ShieldGemma 2 image safety classifier, ensuring responsible AI development. The open model architecture allows for customization and control, promoting safe and innovative applications.\u003C/p\u003E\u003Cp\u003EJoin the Gemm**erse today and experience the cutting-edge advancements of Gemma 3. Whether you\u0026#39;re a developer, researcher, or AI enthusiast, Gemma 3 offers the tools and flexibility to drive your projects forward.\u003C/p\u003E\u003Cp\u003EStart your journey with Gemma 3 now and unlock new possibilities in AI development!\u003C/p\u003E',ipRegion:'',updatedByUid:0,createdAt:'2025-03-15 01:57:29',updatedAt:'2025-03-17 11:59:12',mentionNum:0,mentionedBy:[],mentionUsers:[],likeUsers:[],},{id:40787,num:1,uid:1042,content:'What are the advantages compared to https://openrouter.ai/google/gemma-3-27b-it:free ?',ipRegion:'',updatedByUid:0,createdAt:'2025-03-15 03:49:48',updatedAt:'2025-03-17 11:59:12',mentionNum:0,mentionedBy:[],mentionUsers:[],likeUsers:[],},{id:40788,num:2,uid:9606,content:'是自带联网功能的吗',ipRegion:'',updatedByUid:0,createdAt:'2025-03-15 17:55:52',updatedAt:'2025-03-17 11:59:12',mentionNum:0,mentionedBy:[],mentionUsers:[],likeUsers:[],},],usersMap:new Map([[1042,{uid:1042,url:'/u/2c0857596a045c76606e546f390c3800',avatar:'/a/2c0857596a045c76606e546f390c3800',username:'ZeroClover🤖',}],[209,{uid:209,url:'/u/620d04246a045c77626a5f6f2e511913',avatar:'/a/620d04246a045c77626a5f6f2e511913',username:'z327774948🤖',}],[9606,{uid:9606,url:'/u/183c781b6a045c7e666a506f11036616',avatar:'/a/183c781b6a045c7e666a506f11036616',username:'CHEN1016🤖',}],]),related:[{title:'Google出新模型了,打榜第二只有27b',url:'/d/630851216a045c77606a5671445d606a060d3b61',},{title:'半个小时前, ollama 上线了目前单显卡里,最强的中小模型 gemma3',url:'/d/36285e3e6a045c77606a5670475f666a59142066',},],} const App={setup(){const goTo=useGoTo() const{mdAndUp}=useDisplay() return{goTo,mdAndUp}},data(){return data;},mounted(){const themeDark=localStorage.getItem("themeDark") if(themeDark!==null){this.theme.dark=JSON.parse(themeDark)} if(this.nav.post.total>(this.nav.post.currentPage-1)*100+20){let moreLen=100 if(this.nav.post.total({id:null,num:(this.nav.post.currentPage-1)*100+v,uid:null,content:null,ipRegion:null,updatedByUid:null,createdAt:null,updatedAt:null,mentionNum:null,mentionedBy:null,mentionUsers:null,likeUsers:null,})) this.posts.push(...morePosts.slice(20))} this.workerStart() const hash=window.location.hash const match=hash.match(/#(\d+)/) if(match){const n=parseInt(match[1],10) if(n>=(this.nav.post.currentPage-1)*100&&n{this.jumpTo(n)})}} this.$nextTick(()=>{this.addHeadingIds() tocbot.init({tocSelector:'.toc',contentSelector:'#post-content-0',headingSelector:'h2, h3, h4',headingsOffset:100,scrollSmoothOffset:-100,scrollSmooth:true,collapseDepth:6,onClick:function(e){setTimeout(()=>{history.replaceState(null,'',window.location.pathname+window.location.search)},0)},}) tocbot.refresh()});},beforeUnmount(){this.workerStop() if(this.quill){this.quill.destroy() this.quill=null}},computed:{dposts(){return this.posts.slice(20);},},created(){},methods:{successAlert(msg){this.alert={show:true,color:'success',text:msg,timeout:1500,}},failureAlert(msg){this.alert={show:true,color:'error',text:msg,timeout:5000,}},flipThemeDark(){this.theme.dark=!this.theme.dark localStorage.setItem("themeDark",JSON.stringify(this.theme.dark))},toSearch(){if(!this.search.text){this.failureAlert('搜索词不能为空') return} let keywords=this.search.text.trim() if(keywords.length<1){this.failureAlert('搜索词不能为空') return} if(keywords.length>100){this.failureAlert('搜索词过长') return} this.doSearch(keywords)},toReg(){window.location.href="/reg"},toLogin(){window.location.href="/login"},toPage(){let url=window.location.href url=url.replace(/(\/\d+)?(#[0-9]+)?$/,this.nav.post.targetPage>1?`/${this.nav.post.targetPage}`:'') window.location.href=url},toLoadRelated({done}){if(this.my&&this.my.uid){this.apiLoadRelated({done})}else{done('ok')}},workerStart(){this.nav.post.worker=setInterval(()=>{this.workerLoad()},500);},workerStop(){if(this.nav.post.worker){clearInterval(this.nav.post.worker);this.nav.post.worker=null;}},async jumpTo(num){const page=Math.floor(num/100)+1 const i=num-(page-1)*100 if(page===this.nav.post.currentPage){this.goTo("#post-"+num,this.nav.post.goToOptions) if(!this.posts[i].id){const block=Math.floor(num/20)+1 this.nav.post.apiLock[block]=true await this.apiLoadPosts(block) this.$nextTick(()=>{this.goTo("#post-"+num,this.nav.post.goToOptions)})}}else{let url=window.location.href url=url.replace(/(\/\d+)?(#[0-9]+)?$/,page>1?`/${page}`:'') url=url+"#"+num window.location.href=url}},postIntersect(num){return(isIntersecting,entries,observer)=>{if(isIntersecting){this.nav.post.task.push(num) this.nav.post.active.push(num) this.nav.post.active=this.nav.post.active.filter(item=>Math.abs(item-num)<=5) this.nav.post.active.sort((a,b)=>a-b)}else{this.nav.post.active=this.nav.post.active.filter(item=>item!==num)} if(this.nav.post.active[0]){this.nav.post.anchor=this.nav.post.active[0]}else{this.nav.post.anchor=0}}},async apiLoadPosts(block){try{const response=await axios.post('/fapi/v1/post/block/'+block,{discussionId:this.nav.post.discussionId,}) if(response.data.code===0){response.data.data.posts.forEach(post=>{const i=post.num%100 Object.assign(this.posts[i],post)}) response.data.data.users.forEach(user=>{this.usersMap.set(user.uid,user)})}else{this.failureAlert('回帖数据加载失败: '+response.data.msg)}}catch(error){this.failureAlert('回帖数据加载失败: '+error)} this.nav.post.apiLock[block]=false},workerLoad(){while(this.nav.post.task.length){const num=this.nav.post.task.pop() const i=num-(this.nav.post.currentPage-1)*100 if(!this.posts[i].id){const block=Math.floor(num/20)+1 if(!this.nav.post.apiLock[block]){this.nav.post.apiLock[block]=true this.apiLoadPosts(block)}}}},getTimeInfo(t){if(!t){return ""} const now=new Date();const then=new Date(t);const diff=now-then;const minute=60*1000;const hour=minute*60;const day=hour*24;const month=day*30;const year=month*12;if(diffpost.num===num) if(!post){return "#"+num} const uid=post.uid const username=this.usersMap.get(uid)?.username if(!username){return "#"+num} return username},getUsernameByPostId(id){const post=this.posts.find(post=>post.id===id) if(!post){return "#"+this.getPostNumByPostId(id)} const uid=post.uid const username=this.usersMap.get(uid).username if(!username){return "#"+this.getPostNumByPostId(id)} return username},getPostNumByPostId(id){const post=this.posts.find(post=>post.id===id) return post.num},getPostById(id){const post=this.posts.find(post=>post.id===id) return post},getPostByNum(num){const post=this.posts.find(post=>post.num===num) return post},getAvatarByUid(uid){const avatar=this.usersMap.get(uid)?.avatar if(!avatar){return this.getRandomAvatar()} return avatar},getAvatarByPostNum(num){const post=this.posts.find(post=>post.num===num) if(!post){return this.getRandomAvatar()} const uid=post.uid return this.getAvatarByUid(uid)},getRandomAvatar(){const num=Math.floor(Math.random()*100) return "https://randomuser.me/api/portraits/men/"+num+".jpg"},getUrlByUid(uid){const url=this.usersMap.get(uid)?.url if(!url){return ""} return url},getTextByPostNum(num){const post=this.posts.find(post=>post.num===num) if(!post||!post.content){return '点击跳转到#'+num+'查看'} const parser=new DOMParser() const doc=parser.parseFromString(post.content,'text/html') const text=doc.body.textContent||'' return text.slice(0,100)},addHeadingIds(){const content=document.getElementById('post-content-0') if(!content){this.nav.showTOC=false return} const headings=content.querySelectorAll('h2, h3, h4') headings.forEach((heading,index)=>{if(!heading.id){heading.id=`toc-nav-${index}`}}) if(headings.length==0){this.nav.showTOC=false}},async doSearch(keywords){this.search.loading=true try{const response=await axios.post('/fapi/v1/search',{keywords:keywords,}) if(response.data.code===0){if(response.data.data.hash&&response.data.data.hash.length===32){window.location.href="/s/"+response.data.data.hash}else{this.failureAlert('搜索失败: 搜索服务异常')}}else{this.failureAlert('搜索失败: '+response.data.msg)}}catch(error){this.failureAlert('搜索失败: '+error)} this.search.loading=false},debounce(fn,delay){let timer=null return function(...args){if(timer)clearTimeout(timer) timer=setTimeout(()=>{fn.apply(this,args)},delay);};},},watch:{'nav.post.targetPage':{handler:async function(newV,oldV){this.toPage()},immediate:false},},} const vuetify=createVuetify({defaults:{global:{ripple:true,},},}) const app=createApp(App) app.use(vuetify).mount("#app")