AgentSkillsCN

real-estate-workflows

为 ComfyUI 工作流模板管理缩略图与预览图像。添加、替换、校验并审核缩略图。当用户提出以下需求时使用:添加缩略图、替换预览图像、更新模板图像、修复缺失的缩略图、检查缩略图、审核缩略图、哪些模板需要缩略图、缺少预览、添加预览图像、更换模板图片、更新模板视觉效果、交换缩略图、设置缩略图、上传预览、模板图像缺失、缩略图损坏、缩略图未显示。可通过“缩略图”、“预览图像”、“模板图像”、“模板图片”、“缺失缩略图”、“添加图像”、“替换图像”、“视觉资产”等短语触发。

SKILL.md
--- frontmatter
name: real-estate-workflows
description: End-to-end workflows for real estate content production. Use when orchestrating multi-step processes like URL-to-video generation, batch processing, or social media distribution. Coordinates Firecrawl, AI generation, and Remotion rendering.
allowed-tools: Read, Grep, Glob, Bash, Edit, Write

Real Estate Workflows

Core Pipeline

URL → Video Workflow

code
[Listing URL Input]
       ↓
[Firecrawl Extraction]
       ↓
[Data Validation]
       ↓
[AI Script Generation]
       ↓
[TTS Voiceover (Optional)]
       ↓
[Remotion Render]
       ↓
[Upload to Storage]
       ↓
[Notify User]

Workflow API

Single Video Generation

typescript
POST /api/workflow/generate-video
{
  listingUrl: "https://zillow.com/...",
  videoType: "property-showcase",
  options: {
    voiceover: true,
    music: "upbeat",
    branding: {
      agentName: "Jane Smith",
      logoUrl: "https://..."
    }
  }
}

Batch Processing

typescript
POST /api/workflow/batch
{
  urls: ["url1", "url2", "url3"],
  videoType: "social-short",
  options: { ... }
}

Status Tracking

typescript
GET /api/workflow/status/:jobId

{
  jobId: "job_abc123",
  status: "rendering",
  progress: 65,
  steps: [
    { name: "scrape", status: "complete", duration: 2.3 },
    { name: "script", status: "complete", duration: 4.1 },
    { name: "voiceover", status: "complete", duration: 8.2 },
    { name: "render", status: "in_progress", progress: 45 }
  ],
  estimatedCompletion: "2024-01-15T10:30:00Z"
}

Detailed Rules

Database Schema

Video Jobs (Convex)

typescript
defineTable({
  userId: v.string(),
  listingUrl: v.string(),
  videoType: v.string(),
  status: v.string(), // pending, scraping, generating, rendering, complete, failed
  progress: v.number(),
  propertyData: v.optional(v.any()),
  script: v.optional(v.string()),
  voiceoverUrl: v.optional(v.string()),
  videoUrl: v.optional(v.string()),
  thumbnailUrl: v.optional(v.string()),
  error: v.optional(v.string()),
  createdAt: v.number(),
  completedAt: v.optional(v.number()),
})

Error Handling

ErrorRecovery
Scrape failedRetry with fallback parser
AI timeoutRetry with shorter prompt
Render OOMReduce resolution, retry
Storage failedQueue for later upload

Webhook Notifications

typescript
// Configure in user settings
POST /webhooks/video-complete
{
  event: "video.complete",
  jobId: "job_abc123",
  videoUrl: "https://storage.../video.mp4",
  propertyAddress: "123 Main St",
  timestamp: "2024-01-15T10:30:00Z"
}

Integrations

  • Firecrawl: Property data extraction
  • Gemini AI: Script generation
  • OpenAI TTS: Voiceover synthesis
  • Remotion Lambda: Video rendering
  • Supabase Storage: Asset hosting
  • Convex: Real-time job tracking
  • Clerk: User authentication
  • Stripe: Usage billing