openapi: 3.0.3
info:
  title: Mid Agent Runtime Hardening Provider API
  version: 0.1.0
  x-contract-level: L2
paths:
  /mid/dialogue/respond:
    post:
      operationId: respondDialogue
      summary: 运行时加固后的中台对话响应
      x-requirements:
        - AC-MARH-01
        - AC-MARH-02
        - AC-MARH-03
        - AC-MARH-04
        - AC-MARH-05
        - AC-MARH-06
        - AC-MARH-07
        - AC-MARH-08
        - AC-MARH-09
        - AC-MARH-10
        - AC-MARH-11
        - AC-MARH-12
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DialogueRequest'
      responses:
        '200':
          description: 成功响应
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DialogueResponse'
        '400':
          description: 请求参数错误
        '500':
          description: 服务内部错误

components:
  schemas:
    DialogueRequest:
      type: object
      required:
        - session_id
        - user_message
        - history
      properties:
        session_id:
          type: string
        user_id:
          type: string
        user_message:
          type: string
          minLength: 1
          maxLength: 2000
        history:
          type: array
          description: 仅已送达历史
          items:
            $ref: '#/components/schemas/HistoryMessage'
        interrupted_segments:
          type: array
          items:
            $ref: '#/components/schemas/InterruptedSegment'
        humanize_config:
          $ref: '#/components/schemas/HumanizeConfig'

    HistoryMessage:
      type: object
      required:
        - role
        - content
      properties:
        role:
          type: string
          enum: [user, assistant, human]
        content:
          type: string

    InterruptedSegment:
      type: object
      required:
        - segment_id
        - content
      properties:
        segment_id:
          type: string
        content:
          type: string

    HumanizeConfig:
      type: object
      properties:
        enabled:
          type: boolean
        min_delay_ms:
          type: integer
          minimum: 0
        max_delay_ms:
          type: integer
          minimum: 0
        length_bucket_strategy:
          type: string
          enum: [simple, semantic]

    DialogueResponse:
      type: object
      required:
        - segments
        - trace
      properties:
        segments:
          type: array
          items:
            $ref: '#/components/schemas/Segment'
        trace:
          $ref: '#/components/schemas/TraceInfo'

    Segment:
      type: object
      required:
        - segment_id
        - text
        - delay_after
      properties:
        segment_id:
          type: string
        text:
          type: string
        delay_after:
          type: integer
          minimum: 0

    SegmentStats:
      type: object
      properties:
        segment_count:
          type: integer
        avg_segment_length:
          type: number
          format: float
        humanize_strategy:
          type: string

    TraceInfo:
      type: object
      required:
        - mode
      properties:
        mode:
          type: string
          enum: [agent, micro_flow, fixed, transfer]
        request_id:
          type: string
        generation_id:
          type: string
        guardrail_triggered:
          type: boolean
        guardrail_rule_id:
          type: string
        interrupt_consumed:
          type: boolean
        kb_tool_called:
          type: boolean
        kb_hit:
          type: boolean
        fallback_reason_code:
          type: string
        react_iterations:
          type: integer
          minimum: 0
          maximum: 5
        timeout_profile:
          $ref: '#/components/schemas/TimeoutProfile'
        segment_stats:
          $ref: '#/components/schemas/SegmentStats'

    TimeoutProfile:
      type: object
      properties:
        per_tool_timeout_ms:
          type: integer
          maximum: 2000
        end_to_end_timeout_ms:
          type: integer
          maximum: 8000
