73f4788d7e
- Update READMEs and docs across multiple languages - Enhance interactive demos for Agent, LLM, VLM, Audio, Image Gen, Terminal, and Web Basics - Add new appendix sections for Database and IDE intros - Update VitePress config, theme, and utility scripts - Clean up unused assets and components
124 lines
4.5 KiB
Vue
124 lines
4.5 KiB
Vue
<!--
|
||
FrameworkSelectionDemo.vue
|
||
框架选择小向导:回答 3 个问题,给出推荐 + 适配理由 + 你需要注意什么。
|
||
-->
|
||
<template>
|
||
<div class="sel">
|
||
<div class="header">
|
||
<div>
|
||
<div class="title">三问选框架</div>
|
||
<div class="subtitle">目标:先跑通一个最小 Agent,再逐步增强。</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="q">
|
||
<div class="q-title">1) 你更在乎什么?</div>
|
||
<div class="opts">
|
||
<button v-for="o in q1" :key="o.id" :class="['opt', { active: a1 === o.id }]" @click="a1 = o.id">{{ o.label }}</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="q">
|
||
<div class="q-title">2) 你的任务像哪种?</div>
|
||
<div class="opts">
|
||
<button v-for="o in q2" :key="o.id" :class="['opt', { active: a2 === o.id }]" @click="a2 = o.id">{{ o.label }}</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="q">
|
||
<div class="q-title">3) 需要多 Agent 分工吗?</div>
|
||
<div class="opts">
|
||
<button v-for="o in q3" :key="o.id" :class="['opt', { active: a3 === o.id }]" @click="a3 = o.id">{{ o.label }}</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="result">
|
||
<div class="r-title">推荐:{{ rec.name }}</div>
|
||
<div class="r-body">{{ rec.reason }}</div>
|
||
<div class="r-note"><strong>注意:</strong>{{ rec.note }}</div>
|
||
<div class="r-next"><strong>下一步:</strong>{{ rec.next }}</div>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup>
|
||
import { computed, ref } from 'vue'
|
||
|
||
const q1 = [
|
||
{ id: 'easy', label: '快速上手' },
|
||
{ id: 'stable', label: '可控可上线' },
|
||
{ id: 'team', label: '团队协作' }
|
||
]
|
||
const q2 = [
|
||
{ id: 'workflow', label: '有明确流程(步骤/图)' },
|
||
{ id: 'chat', label: '偏对话与协商' },
|
||
{ id: 'explore', label: '探索式试错' }
|
||
]
|
||
const q3 = [
|
||
{ id: 'no', label: '不需要' },
|
||
{ id: 'maybe', label: '可能需要' },
|
||
{ id: 'yes', label: '必须需要' }
|
||
]
|
||
|
||
const a1 = ref('stable')
|
||
const a2 = ref('workflow')
|
||
const a3 = ref('maybe')
|
||
|
||
const rec = computed(() => {
|
||
// Multi-agent first
|
||
if (a3.value === 'yes' || a1.value === 'team') {
|
||
if (a2.value === 'chat') {
|
||
return {
|
||
name: 'AutoGen',
|
||
reason: '多 Agent 对话协作是强项,适合“互相讨论、分工协作”。',
|
||
note: '先把角色边界写清楚,否则容易重复劳动或互怼。',
|
||
next: '从 2 个 Agent 开始:研究员 + 执行者。'
|
||
}
|
||
}
|
||
return {
|
||
name: 'CrewAI',
|
||
reason: '角色+任务模型很直观,适合“分工明确”的团队工作流。',
|
||
note: '先把输入/输出格式定死,避免多人输出难合并。',
|
||
next: '先搭 2-3 个角色:Researcher/Writer/Reviewer。'
|
||
}
|
||
}
|
||
|
||
// Single-agent / controllable workflow
|
||
if (a1.value === 'stable' || a2.value === 'workflow') {
|
||
return {
|
||
name: 'LangChain / LangGraph',
|
||
reason: '更适合把 Agent 写成“可控流程”,便于调试、上线、加护栏。',
|
||
note: '别一上来做大系统,先把 1 个工具调用跑通。',
|
||
next: '用 LangGraph 画一个 3-5 节点的小图。'
|
||
}
|
||
}
|
||
|
||
// Easy start
|
||
return {
|
||
name: 'CrewAI',
|
||
reason: '上手快、概念直观,适合先做出一个“能跑”的 demo。',
|
||
note: 'demo 能跑不代表可上线,后续要补安全与可观测。',
|
||
next: '先做一个“研究+写作”的最小团队。'
|
||
}
|
||
})
|
||
</script>
|
||
|
||
<style scoped>
|
||
.sel { border: 1px solid var(--vp-c-divider); border-radius: 12px; background: var(--vp-c-bg-soft); padding: 16px; margin: 20px 0; display: flex; flex-direction: column; gap: 12px; }
|
||
.header { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
|
||
.title { font-weight: 800; }
|
||
.subtitle { color: var(--vp-c-text-2); font-size: 13px; }
|
||
|
||
.q { background: var(--vp-c-bg); border: 1px solid var(--vp-c-divider); border-radius: 12px; padding: 12px; }
|
||
.q-title { font-weight: 800; margin-bottom: 8px; }
|
||
.opts { display: flex; gap: 8px; flex-wrap: wrap; }
|
||
.opt { border: 1px solid var(--vp-c-divider); background: var(--vp-c-bg); padding: 8px 12px; border-radius: 999px; cursor: pointer; }
|
||
.opt.active { border-color: var(--vp-c-brand); color: var(--vp-c-brand); box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
|
||
|
||
.result { background: var(--vp-c-bg); border: 1px dashed var(--vp-c-divider); border-radius: 12px; padding: 12px; }
|
||
.r-title { font-weight: 900; margin-bottom: 6px; }
|
||
.r-body { color: var(--vp-c-text-2); line-height: 1.6; margin-bottom: 6px; }
|
||
.r-note, .r-next { color: var(--vp-c-text-2); line-height: 1.6; }
|
||
</style>
|
||
|