Files
resolutionflow/backend/app/schemas/script_builder.py
Michael Chihlas f2fce27f0d feat(pilot): pydantic schemas for inline origin + script PATCH
- ScriptBuilderCreateRequest gains origin ('standalone' | 'pilot_inline')
  and optional ai_session_id. Handler-side validation (next task) enforces
  pilot_inline ⇒ ai_session_id required + owned by caller.
- SessionSuggestedFixScriptRequest added for the new PATCH /script
  endpoint (Phase 9 Task 6).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 01:53:28 -04:00

96 lines
2.8 KiB
Python

"""Pydantic schemas for the AI Script Builder."""
from datetime import datetime
from typing import Literal, Optional
from uuid import UUID
from pydantic import BaseModel, Field
class ScriptBuilderCreateRequest(BaseModel):
"""Request to start (or get-or-create, for inline origin) a builder session.
When `origin='pilot_inline'`, `ai_session_id` is REQUIRED and must
reference a pilot session owned by the current user. The endpoint's
get-or-create semantics kick in: if a pilot_inline session already
exists for (user_id, ai_session_id), that row is returned instead of
creating a duplicate.
"""
language: str = Field(
default="powershell",
pattern=r"^(powershell|bash|python)$",
description="Script language",
)
origin: Literal["standalone", "pilot_inline"] = "standalone"
ai_session_id: UUID | None = None
class ScriptBuilderMessageRequest(BaseModel):
"""User message in a builder session."""
content: str = Field(min_length=1, max_length=5000)
class ScriptBuilderMessageSchema(BaseModel):
"""A single message in a builder session."""
id: UUID
role: str
content: str
script: str | None = None
script_filename: str | None = None
line_count: int | None = None
input_tokens: int | None = None
output_tokens: int | None = None
created_at: datetime
model_config = {"from_attributes": True}
class ScriptBuilderMessageResponse(BaseModel):
"""AI response to a builder message."""
role: str = "assistant"
content: str
script: str | None = None
script_filename: str | None = None
line_count: int | None = None
timestamp: datetime
model_config = {"from_attributes": True}
class ScriptBuilderSessionSummary(BaseModel):
"""Lightweight session for list views (no messages)."""
id: UUID
language: str
title: str | None = None
message_count: int = 0
latest_script_filename: str | None = None
created_at: datetime
updated_at: datetime
model_config = {"from_attributes": True}
class ScriptBuilderSessionDetail(BaseModel):
"""Full session with message history."""
id: UUID
language: str
title: str | None = None
messages: list[ScriptBuilderMessageSchema] = []
latest_script: str | None = None
latest_script_filename: str | None = None
message_count: int = 0
ai_session_id: UUID | None = None
created_at: datetime
updated_at: datetime
model_config = {"from_attributes": True}
class SaveToLibraryRequest(BaseModel):
"""Request to save a generated script to the Script Library."""
name: str = Field(min_length=1, max_length=200)
description: str | None = None
category_id: UUID | None = None
share_with_team: bool = False
script_body: str | None = None
parameters_schema: dict | None = None