# V2PipelineConfig

**Kind:** Interface

**Source:** [`atloria-monorepo/packages/doc-automation/src/v2/orchestrator.ts`](https://github.com/sherkety/atloria/blob/main/atloria-monorepo/packages/doc-automation/src/v2/orchestrator.ts#L87)

## Properties

| Property | Type |
|---|---|
| `repository` | `{
    url: string;
    branch: string;
    username?: string;
    password?: string;
    paths: {
      frontend?: string;
      backend?: string;
    };
    /** Parser configuration for parser-core integration */
    parsers?: {
      /** Explicit parser names to use (e.g. ['odoo-xml', 'python', 'django']). If omitted, auto-detect. */
      explicit?: string[];
      /** Additional file patterns to include beyond parser defaults */
      additionalPatterns?: string[];
      /** Use parser-core for parsing (default: true). Set false for legacy regex fallback. */
      useParserCore?: boolean;
    };
  }` |
| `project` | `{
    id: string;
    name: string;
    description?: string;
  }` |
| `ai` | `{
    /** AI provider to use (default: 'claude') */
    provider?: 'openai' | 'claude' | 'azure-responses';
    // Claude/Anthropic config
    azureEndpoint?: string;
    azureApiKey?: string;
    anthropicApiKey?: string;
    // OpenAI config
    openaiApiKey?: string;
    azureOpenaiEndpoint?: string;
    azureOpenaiApiKey?: string;
    azureOpenaiDeployment?: string;
    // Azure Responses API config (gpt-5.6-terra by default, overridable via AZURE_OPENAI_MODEL)
    azureResponsesEndpoint?: string;
    azureResponsesApiKey?: string;
    azureResponsesApiVersion?: string;
    // Per-stage model override (used with azure-responses provider)
    stageModels?: {
      analysis?: string;
      synthesis?: string;
      structure?: string;
      planning?: string;
      generation?: string;
      verification?: string;
      screenshots?: string;
    };
    // Shared config
    model?: string;
    maxTokens?: number;
  }` |
| `documentation` | `{
    targetAudience: 'beginner' | 'intermediate' | 'advanced';
    tone: 'formal' | 'friendly' | 'technical';
    language: string;
    maxDocuments: number;
    // User-suggested categories from project config (AI can add/remove based on codebase)
    suggestedCategories?: string[];
  }` |
| `output` | `{
    workDir: string;
    outputDir: string;
  }` |
| `options` | `{
    skipScreenshots?: boolean;
    skipUpload?: boolean;
    skipVerification?: boolean;
    resumeFromCheckpoint?: boolean;
    skipQualityGate?: boolean;
    /** Run screenshots in background (non-blocking). Default: true */
    asyncScreenshots?: boolean;
    /** Skip AI verification for docs that passed quality gate. Default: true */
    skipVerificationForPassingDocs?: boolean;
    /** Screenshots only — skip doc generation, read existing docs from DB */
    screenshotsOnly?: boolean;
    /** Use V4d structure generation — replaces Stages 4+5+6 with parser-based approach.
     *  Uses slim synthesis (1 AI call) + 3 parallel structure sessions.
     *  ~3 min, ~$0.50 vs current ~37 min, ~$8. */
    useV4dStructure?: boolean;
    /** Enable agent-powered verification — uses AI agent with code tools to verify
     *  generated docs against source code. More thorough than Stage 11's LLM-only check.
     *  Runs after Quality Gate, before Stage 11. Default: false (opt-in). */
    enableAgentVerification?: boolean;
    /** Use agent-writer for Stage 10 — AI agent explores source code AND writes docs
     *  in the same session. More accurate than GeneratorService because the agent reads
     *  actual code while writing. Requires Azure Responses API credentials.
     *  Default: false (opt-in). */
    useAgentWriter?: boolean;
  }` |
| `businessDomain` | `'ERP' | 'SaaS' | 'E-commerce' | 'CMS' | 'Generic'` |
| `businessContext` | `BusinessContext` |
| `contextSources` | `{ type: 'pdf' | 'url' | 'file' | 'text'; path: string; content?: string }[]` |
| `rateLimiter` | `{
    /** Max concurrent AI requests. Default: 5 for Azure, 30 for others */
    maxConcurrent?: number;
    /** Min delay between requests in ms. Default: 1000 for Azure, 25 for others */
    minDelayMs?: number;
  }` |
| `screenshots` | `{
    /** URL of the screenshot-worker microservice */
    workerUrl?: string;
    /** Site URL for screenshots (defaults to siteUrl from config) */
    siteUrl?: string;
    /** Login URL for authentication */
    loginUrl?: string;
    /** Login credentials */
    credentials?: {
      username: string;
      password: string;
      usernameSelector?: string;
      passwordSelector?: string;
      submitSelector?: string;
      successSelector?: string;
    };
    /** Viewport configuration */
    viewport?: {
      width: number;
      height: number;
    };
    /** Screenshot format */
    format?: 'png' | 'jpeg' | 'webp';
    /** Screenshot quality (for jpeg/webp) */
    quality?: number;
    /** Maximum concurrent capture sessions */
    maxConcurrency?: number;
    /** Azure blob storage container name */
    azureContainerName?: string;
    /** Whether to check for duplicate screenshots */
    checkDuplicates?: boolean;
    /** Frontend framework hint (e.g. 'angular', 'react', 'vue') — used for URL validation */
    framework?: string;
  }` |
| `onScreenshotsComplete` | `(stats: { captured: number; failed: number; replaced: number; totalPlaceholders: number }) => void` |
| `onScreenshotProgress` | `(progress: { captured: number; failed: number; total: number; currentUrl?: string }) => void` |
| `upload` | `{
    /** Prisma client for database access */
    prisma: any; // Using 'any' to avoid circular dependency with @prisma/client
    /** Organization ID for document ownership */
    organizationId: string;
    /** User ID who created the documents */
    createdById: string;
    /** Job ID for tracking which job created documents */
    jobId?: string;
    /** Target audience slug (e.g., 'user', 'developer') */
    audienceSlug?: string;
    /** Optional function to upload images to Azure via assets API */
    uploadImage?: (buffer: Buffer, filename: string, mimeType: string) => Promise<string>;
    /** Batch configuration */
    batch?: {
      maxRetries?: number;
      retryDelay?: number;
      maxConcurrency?: number;
      requestsPerSecond?: number;
      uploadScreenshotsFirst?: boolean;
    };
    /** When true, documents with groundingScore < 0.3 are excluded from upload. Default: false */
    skipUnverifiableContent?: boolean;
    /** DocVersion ID (Phase 1) — when set, upload operates in create-only mode */
    docVersionId?: string;
  }` |
