探索笔记
杂谈2026年9月14日

前端设计

在修改的同时还应该强调需要完成前端网页的构建,包括真实api的引入,页面布局的优化问题,这一方面就见仁见智了。

前端打开方式:

npm install
npm run dev

到这一阶段整个agent算是开发完成,后期需要大量测试和调试,这里建议使用deepseek的api作为业务api接入,他在廉价的同时还能保持极高的效果,一个视频甚至只需要5毛钱之内。

这是这一阶段的前端参考,如果你仔细观察过后端代码你会发现其中存在着大量开关,而前端的按钮少之又少,由此可以判定这个前端实际上完全是游离于主业务之外的。

你可以在这一阶段修改前端,也可以留到架构重构完成之后再修改,甚至,你可以直接扬弃web端转向cil的开发。我建议在前期保留一个跑完整个链路的脚本,后期再根据实际情况构建前端,参考脚本如下:

Set-Location F:\ManiMind
 
$ErrorActionPreference = 'Stop'
 
  
 
# ===== 参数 =====
 
$PY = ''
 
$PROJECT = 'auto-project'
 
$SESSION = 'e2e-full-' + (Get-Date -Format 'yyyyMMdd-HHmmss')
 
$MANIFEST_RUN = "runtime\sessions\$SESSION\manifest.auto.json"
 
  
 
# ===== 目录 =====
 
New-Item -ItemType Directory -Path 'inputs\papers','inputs\notes',"runtime\sessions\$SESSION" -Force | Out-Null
 
  
 
# ===== 选输入 =====
 
$paper = Get-ChildItem 'inputs\papers' -File | Where-Object { $_.Extension -in '.md','.txt','.pdf' } | Select-Object -First 1
 
if (-not $paper) { throw '未找到输入素材:请先放 .md/.txt/.pdf 到 inputs/papers/' }
 
  
 
# ===== 生成 manifest =====
 
$manifest = @{
 
  project_id = $PROJECT
 
  title = "Auto E2E from $($paper.Name)"
 
  source_bundle = @{
 
    paper_path = "inputs/papers/$($paper.Name)"
 
    note_paths = @()
 
    audience = "数学科普受众"
 
    style_refs = @("先直觉后公式","分段清晰","术语一致")
 
  }
 
  segments = @(
 
    @{
 
      id = "seg-intro-html"
 
      title = "引子"
 
      goal = "建立问题背景与观众预期"
 
      narration = "我们先用直观方式理解问题,再进入核心公式。"
 
      modality = "html"
 
      html_motion_notes = @("标题渐入","概念卡片切换")
 
      estimated_seconds = 18
 
    },
 
    @{
 
      id = "seg-core-manim"
 
      title = "公式核心"
 
      goal = "完成关键公式推导与可视化"
 
      narration = "下面进入公式核心部分,按步骤展示推导链路。"
 
      modality = "manim"
 
      formulas = @("\frac{a+b}{2}\ge\sqrt{ab}")
 
      estimated_seconds = 28
 
    },
 
    @{
 
      id = "seg-bridge-html"
 
      title = "桥接与总结"
 
      goal = "连接前后段并收束结论"
 
      narration = "最后回顾核心结论,并说明它在更一般情形下的意义。"
 
      modality = "html"
 
      html_motion_notes = @("要点高亮","结论收束")
 
      estimated_seconds = 20
 
    }
 
  )
 
}
 
$manifest | ConvertTo-Json -Depth 20 | Set-Content $MANIFEST_RUN -Encoding UTF8
 
if (-not (Test-Path $MANIFEST_RUN)) { throw "manifest_not_created: $MANIFEST_RUN" }
 
  
 
# ===== DeepSeek 环境 =====
 
$env:PYTHONPATH = "$PWD\src"
 
$env:OPENAI_API_KEY = ''
 
$env:MANIMIND_REVIEW_API_KEY = $env:OPENAI_API_KEY
 
$env:MANIMIND_WORKER_API_KEY = $env:OPENAI_API_KEY
 
  
 
$env:MANIMIND_MODEL_BASE_URL = 'https://api.deepseek.com'
 
$env:MANIMIND_REVIEW_MODEL_BASE_URL = 'https://api.deepseek.com'
 
$env:MANIMIND_WORKER_MODEL_BASE_URL = 'https://api.deepseek.com'
 
  
 
$env:MANIMIND_MODEL_WIRE_API = 'chat_completions'
 
$env:MANIMIND_REVIEW_MODEL_WIRE_API = 'chat_completions'
 
$env:MANIMIND_WORKER_MODEL_WIRE_API = 'chat_completions'
 
  
 
$env:MANIMIND_MODEL = 'deepseek-v4-pro'
 
$env:MANIMIND_REVIEW_MODEL = 'deepseek-v4-pro'
 
$env:MANIMIND_WORKER_MODEL = 'deepseek-v4-flash'
 
$env:MANIMIND_MODEL_PROVIDER = 'deepseek'
 
$env:MANIMIND_WORKER_MODEL_PROVIDER = 'deepseek'
 
  
 
$env:MANIMIND_DISABLE_RESPONSE_STORAGE = 'true'
 
$env:MANIMIND_LLM_RETRY_COUNT = '5'
 
$env:MANIMIND_LLM_TIMEOUT_SECONDS = '300'
 
$env:MANIMIND_REVIEW_LLM_TIMEOUT_SECONDS = '300'
 
$env:MANIMIND_WORKER_LLM_TIMEOUT_SECONDS = '300'
 
  
 
$env:MANIMIND_DISPATCH_MAX_WORKERS = '3'
 
  
 
# 本机工具路径
 
$env:MANIMIND_FFMPEG_PATH = ''
 
$env:MANIMIND_MANIM_PATH = ''
 
  
 
# TTS provider(前移到 run-to-review 中自动执行)
 
$env:MANIMIND_TTS_PROVIDER = 'powershell_sapi'
 
  
 
# ===== 执行 =====
 
Write-Host "=== bootstrap ===" -ForegroundColor Cyan
 
& $PY -m manimind.main bootstrap
 
if ($LASTEXITCODE -ne 0) { throw 'bootstrap failed' }
 
  
 
Write-Host "=== doctor ===" -ForegroundColor Cyan
 
& $PY -m manimind.main doctor
 
if ($LASTEXITCODE -ne 0) { throw 'doctor failed' }
 
  
 
Write-Host "=== pytest ===" -ForegroundColor Cyan
 
& $PY -m pytest -q
 
if ($LASTEXITCODE -ne 0) { throw 'pytest failed' }
 
  
 
Write-Host "=== run-to-review ===" -ForegroundColor Cyan
 
& $PY -m manimind.main run-to-review $MANIFEST_RUN --session-id $SESSION
 
if ($LASTEXITCODE -ne 0) { throw 'run-to-review failed' }
 
  
 
Write-Host "=== human-review approve ===" -ForegroundColor Cyan
 
& $PY -m manimind.main human-review $MANIFEST_RUN approve --session-id $SESSION --reason 'auto-approve e2e'
 
if ($LASTEXITCODE -ne 0) { throw 'human-review approve failed' }
 
  
 
Write-Host "=== finalize ===" -ForegroundColor Cyan
 
& $PY -m manimind.main finalize $MANIFEST_RUN --session-id $SESSION --tts-provider powershell_sapi
 
if ($LASTEXITCODE -ne 0) { throw 'finalize failed' }
 
  
 
Write-Host ""
 
Write-Host "===== DONE =====" -ForegroundColor Green
 
Write-Host "Session: $SESSION"
 
Write-Host "Manifest: $MANIFEST_RUN"
 
Write-Host "Input paper: inputs/papers/$($paper.Name)"
 
Write-Host "Asset manifest: outputs\$PROJECT\artifacts\$PROJECT.asset.manifest.json"
 
Write-Host "Final video: outputs\$PROJECT\video\final-with-audio.mp4"
 
Write-Host "Timing manifest: runtime\projects\$PROJECT\timing_manifest.json"

反向链接