mirror of
https://github.com/openswarm-ai/openswarm.git
synced 2026-08-17 18:25:42 +02:00
82 lines
3.1 KiB
Python
82 lines
3.1 KiB
Python
"""Typed shapes for the onboarding v3 endpoints (identity, local scan, prep)."""
|
|
|
|
from typing import List, Optional
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
from backend.apps.settings.models import PersonalizedAutomation, PersonalizedMenu, PersonalizedStarter
|
|
|
|
|
|
class ProviderIdentity(BaseModel):
|
|
model_config = ConfigDict(validate_assignment=True)
|
|
|
|
provider: str
|
|
label: str
|
|
email: Optional[str] = None
|
|
plan: Optional[str] = None
|
|
|
|
|
|
class IdentityResponse(BaseModel):
|
|
model_config = ConfigDict(validate_assignment=True)
|
|
|
|
providers: List[ProviderIdentity] = Field(default_factory=list)
|
|
|
|
|
|
class FolderSummary(BaseModel):
|
|
model_config = ConfigDict(validate_assignment=True)
|
|
|
|
name: str
|
|
entry_count: int = 0
|
|
screenshot_count: int = 0
|
|
top_extensions: List[str] = Field(default_factory=list)
|
|
|
|
|
|
class ScanResult(BaseModel):
|
|
model_config = ConfigDict(validate_assignment=True)
|
|
|
|
apps: List[str] = Field(default_factory=list)
|
|
# The high-signal subset of apps (IDEs, design/creative tools); the profile leans on these.
|
|
signal_apps: List[str] = Field(default_factory=list)
|
|
folders: List[FolderSummary] = Field(default_factory=list)
|
|
git_repo_count: int = 0
|
|
has_gitconfig: bool = False
|
|
|
|
|
|
class PrepRequest(BaseModel):
|
|
model_config = ConfigDict(validate_assignment=True)
|
|
|
|
scan: Optional[ScanResult] = None
|
|
picked_apps: List[str] = Field(default_factory=list)
|
|
identity: List[ProviderIdentity] = Field(default_factory=list)
|
|
usage_summary: str = ""
|
|
|
|
|
|
class PrepResponse(BaseModel):
|
|
model_config = ConfigDict(validate_assignment=True)
|
|
|
|
# A punchy <=10-word identity hook, read at a glance in the reveal's focal beat (the greeting is the
|
|
# longer warm read for the chat; the headline is the scannable one-liner most people actually read).
|
|
headline: str = ""
|
|
# 2-4 word identity titles tailored to this user; the Swarm Card leads with these over the static list.
|
|
epithets: List[str] = Field(default_factory=list)
|
|
greeting: str = ""
|
|
starters: List[PersonalizedStarter] = Field(default_factory=list)
|
|
app_title: str = ""
|
|
app_prompt: str = ""
|
|
app_reason: str = ""
|
|
# The "looked into this for you" card: a live web-research task aimed at the ONE thing this user
|
|
# keeps asking their AI about, so the reveal shows OpenSwarm going and finding it, not just planning.
|
|
research_title: str = ""
|
|
research_prompt: str = ""
|
|
research_reason: str = ""
|
|
# The "watch it drive a real browser" card: an agent opens a public site and does a multi-step task
|
|
# live, so the reveal shows off browser control alongside app-building, research, and scheduling.
|
|
browser_title: str = ""
|
|
browser_prompt: str = ""
|
|
browser_reason: str = ""
|
|
automations: List[PersonalizedAutomation] = Field(default_factory=list)
|
|
# The hero's two-level menu (4 categories x 4 tailored starters); None only if prep never ran.
|
|
menu: Optional[PersonalizedMenu] = None
|
|
# False = scan-grounded fallback (no aux lane at call time); lets the pipeline re-run prep once a real connect lands.
|
|
used_llm: bool = False
|