> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tryvox.co/llms.txt
> Use this file to discover all available pages before exploring further.

# 에이전트 메뉴얼 단건 조회

> 메뉴얼 1건을 조회합니다. 본문, 빌트인 도구, 참조, 진단을 함께 반환합니다.



## OpenAPI

````yaml /api-reference/v3/openapi.json get /agents/{agent_id}/manuals/{manual_id}
openapi: 3.1.0
info:
  title: vox.ai API
  description: >
    vox.ai API v3


    ### v3 공개 계약 규칙


    - 인증은 `Authorization: Bearer <token>` 헤더를 사용합니다. 조직 API 키를 Bearer 토큰으로
    전달합니다.

    - 요청과 응답 필드는 기본적으로 `snake_case`를 사용합니다.

    - `agent.data`는 에이전트 레지스트리와 호환되어야 하므로 `callSettings`, `toolIds`,
    `builtInTools`, `presetDynamicVariables` 같은 camelCase 필드를 유지합니다.

    - `_at`으로 끝나는 타임스탬프는 unix milliseconds입니다. 일부 입력값은 호환성을 위해 10~11자리 unix
    seconds도 허용하고 milliseconds로 정규화합니다.

    - 캠페인 통화 가능 시간은 분 단위 정수(`start_min` / `end_min`)를 사용합니다. 알림 스케줄은 `HH:MM`
    문자열(`start_time` / `end_time`)을 사용합니다.

    - 응답 객체 자신의 식별자는 `id`입니다. 다른 리소스를 참조하는 필드와 path parameter는 `agent_id`,
    `call_id`, `telephone_line_id`처럼 명시적인 이름을 사용합니다.

    - 실패 응답은 `{ "error": { "code", "message", "details" } }` 형태입니다. 가능한 경우
    `details.field`, `details.reason`, `details.allowed_values`를 함께 제공합니다.
  version: 3.0.0
servers:
  - url: https://client-api.tryvox.co/v3
    description: 운영
security: []
paths:
  /agents/{agent_id}/manuals/{manual_id}:
    get:
      tags:
        - AgentManuals
      summary: 에이전트 메뉴얼 단건 조회
      description: 메뉴얼 1건을 조회합니다. 본문, 빌트인 도구, 참조, 진단을 함께 반환합니다.
      operationId: getAgentManual
      parameters:
        - name: agent_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            description: '`agent_id`로 반환되는 에이전트 UUID입니다.'
            title: Agent Id
          description: '`agent_id`로 반환되는 에이전트 UUID입니다.'
        - name: manual_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            description: >-
              메뉴얼 UUID입니다. `GET /v3/agents/{agent_id}/manuals` 응답의 `manual_id`를
              사용합니다.
            title: Manual Id
          description: >-
            메뉴얼 UUID입니다. `GET /v3/agents/{agent_id}/manuals` 응답의 `manual_id`를
            사용합니다.
      responses:
        '200':
          description: 성공 응답
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AgentManualResponse'
        '400':
          description: 요청 검증 오류
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                validationError:
                  summary: 요청 검증 오류
                  value:
                    error:
                      code: VALIDATION_ERROR
                      message: Request validation failed.
                      details:
                        field: name
                        reason: must not be blank
        '401':
          description: 인증이 필요합니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                unauthorized:
                  summary: Bearer 토큰 누락 또는 오류
                  value:
                    error:
                      code: UNAUTHORIZED
                      message: Authentication is required.
                      details: {}
        '403':
          description: 권한이 없습니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                forbidden:
                  summary: 권한이 없습니다.
                  value:
                    error:
                      code: FORBIDDEN
                      message: Permission denied.
                      details: {}
        '404':
          description: 리소스를 찾을 수 없습니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                manualNotFound:
                  summary: 에이전트에서 메뉴얼을 찾을 수 없습니다.
                  value:
                    error:
                      code: MANUAL_NOT_FOUND
                      message: 매뉴얼을 찾을 수 없습니다.
                      details:
                        manual_id: 5b1d7c2e-8f3a-4e6b-9c0d-1a2b3c4d5e6f
                agentNotFound:
                  summary: 에이전트를 찾을 수 없습니다.
                  value:
                    error:
                      code: AGENT_NOT_FOUND
                      message: 에이전트를 찾을 수 없습니다.
                      details:
                        agent_id: 7f3e9c12-4a8b-4d5e-9f1a-2b3c4d5e6f7a
        '429':
          description: >-
            요청 한도를 초과했습니다. API 키 트래픽은 기본값으로 organization당 초당 5회·분당 120회,
            Supabase JWT 트래픽은 기본값으로 사용자당 초당 10회·분당 240회로 제한되며, organization 콘솔에는
            기본 분당 2,400회의 백스톱 한도가 적용됩니다. 한도는 운영자가 조정할 수 있고, 초과한 버킷의 실제 한도와 윈도우는
            429 응답의 X-RateLimit-Limit·X-RateLimit-Window 헤더로 알려줍니다. 개별 경로 자체
            리미터가 만든 429 응답에는 이 헤더가 없을 수 있습니다.
          headers:
            Retry-After:
              description: >-
                초과한 공용 v3 인증 주체(auth-principal) 리미터 윈도우가 초기화될 때까지 남은 시간입니다. 단위는
                초입니다. 개별 경로 자체 리미터가 만든 429 응답에는 이 헤더가 없을 수 있습니다.
              schema:
                type: integer
                minimum: 1
            X-RateLimit-Limit:
              description: >-
                초과한 공용 v3 인증 주체(auth-principal) 리미터 윈도우의 최대 요청 수입니다. 개별 경로 자체
                리미터가 만든 429 응답에는 이 헤더가 없을 수 있습니다.
              schema:
                type: integer
                minimum: 1
            X-RateLimit-Window:
              description: >-
                초과한 공용 v3 인증 주체(auth-principal) 리미터 윈도우의 길이입니다. 단위는 초입니다. 개별 경로
                자체 리미터가 만든 429 응답에는 이 헤더가 없을 수 있습니다.
              schema:
                type: integer
                minimum: 1
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                rateLimited:
                  summary: 요청 한도를 초과했습니다.
                  value:
                    error:
                      code: RATE_LIMIT_EXCEEDED
                      message: Too many requests.
                      details:
                        limit: 10
                        window_seconds: 1
                        scope: user
        '500':
          description: 서버 내부 오류가 발생했습니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                internalError:
                  summary: 서버 내부 오류가 발생했습니다.
                  value:
                    error:
                      code: INTERNAL_ERROR
                      message: Internal server error.
                      details: {}
        '503':
          description: 서비스를 일시적으로 사용할 수 없습니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                serviceUnavailable:
                  summary: 서비스를 일시적으로 사용할 수 없습니다.
                  value:
                    error:
                      code: SERVICE_UNAVAILABLE
                      message: Service temporarily unavailable.
                      details: {}
      security:
        - BearerAuth: []
components:
  schemas:
    AgentManualResponse:
      properties:
        name:
          type: string
          maxLength: 128
          title: Name
          description: 메뉴얼 이름입니다. 최대 128자입니다.
        trigger:
          type: string
          title: Trigger
          description: 메뉴얼을 불러올 대화 상황입니다. 비워 두면 다른 메뉴얼이 참조할 때만 불러옵니다.
        content:
          type: string
          maxLength: 8096
          title: Content
          description: 메뉴얼 본문입니다. 공백을 포함해 최대 8,096자이며 `@tool:`과 `@manual:` 참조를 담을 수 있습니다.
        built_in_tools:
          items:
            oneOf:
              - $ref: '#/components/schemas/EndCallTool'
              - $ref: '#/components/schemas/TransferCallTool'
              - $ref: '#/components/schemas/TransferAgentTool'
              - $ref: '#/components/schemas/SendSmsTool'
              - $ref: '#/components/schemas/SendDtmfTool'
              - $ref: '#/components/schemas/SearchAddressTool'
              - $ref: '#/components/schemas/SkillTool-Output'
          type: array
          title: Built In Tools
          description: >-
            이 메뉴얼의 빌트인 도구 목록입니다. 본문에서 `@tool:{name}`으로 참조합니다. 각 `name`은 고유한
            식별자(`[a-zA-Z_][a-zA-Z0-9_]*`)여야 합니다.
        config:
          additionalProperties:
            anyOf:
              - type: string
                enum:
                  - none
                  - typing
                  - elevator_1
                  - elevator_2
                  - elevator_3
                  - elevator_4
              - type: 'null'
          type: object
          title: Config
          description: 메뉴얼 설정입니다. 옵션은 `tool_call_sound` 하나이며, 메뉴얼을 불러온 직후 재생할 실행 대기음입니다.
        agent_id:
          type: string
          title: Agent Id
          description: 에이전트 UUID입니다.
        manual_id:
          type: string
          title: Manual Id
          description: 메뉴얼 UUID입니다.
        head_revision:
          type: integer
          title: Head Revision
          description: 현재 편집본의 리비전입니다. 다음 쓰기 요청의 `expected_head_revision`으로 보냅니다.
        references:
          additionalProperties:
            items:
              type: string
            type: array
          type: object
          title: References
          description: >-
            본문에서 찾은 참조입니다. `manual_ids`, `tool_ids`(커스텀 도구), `built_in_names`로
            나눠 담습니다.
        diagnostics:
          items:
            additionalProperties: true
            type: object
          type: array
          title: Diagnostics
          description: >-
            이 메뉴얼에서 발견된 진단 목록입니다. 각 항목에 `code`, `severity`, `manual_id`, `path`,
            `reference`, `message`가 담깁니다.
      additionalProperties: false
      type: object
      required:
        - name
        - trigger
        - content
        - agent_id
        - manual_id
        - head_revision
      title: AgentManualResponse
      description: 메뉴얼 1건입니다. 본문의 참조와 진단을 함께 담습니다.
    ErrorResponse:
      type: object
      required:
        - error
      title: ErrorResponse
      description: 모든 실패 응답에서 사용하는 v3 error envelope입니다.
      examples:
        - error:
            code: VALIDATION_ERROR
            message: Request validation failed.
            details:
              field: name
              reason: must not be blank
      properties:
        error:
          $ref: '#/components/schemas/ErrorDetail'
          description: 오류 payload입니다.
    EndCallTool:
      properties:
        speakDuringExecution:
          anyOf:
            - $ref: >-
                #/components/schemas/app__dto__builtin_tool__SpeakDuringExecution
            - type: 'null'
          description: 도구 실행 중 재생할 TTS 메시지입니다.
        allowInterruptionDuringExecution:
          type: boolean
          title: Allowinterruptionduringexecution
          description: 도구 실행 중 사용자 발화로 끼어들 수 있는지 여부입니다.
          default: false
        responseMode:
          type: string
          enum:
            - wait
            - fire_and_forget
          title: Responsemode
          description: '`wait`는 도구 완료를 기다립니다. `fire_and_forget`은 도구를 시작한 뒤 대화를 계속합니다.'
          default: wait
        toolType:
          type: string
          const: end_call
          title: Tool type
          description: built-in 도구 유형입니다.
        name:
          type: string
          title: Name
          default: end_call
          description: 사람이 읽을 수 있는 리소스 이름입니다.
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: 사람이 읽을 수 있는 설명입니다.
      type: object
      required:
        - toolType
      title: EndCallTool
      description: 통화 종료 built-in 도구 설정입니다.
    TransferCallTool:
      properties:
        speakDuringExecution:
          anyOf:
            - $ref: >-
                #/components/schemas/app__dto__builtin_tool__SpeakDuringExecution
            - type: 'null'
          description: 도구 실행 중 재생할 발화 메시지입니다.
        allowInterruptionDuringExecution:
          type: boolean
          title: Allowinterruptionduringexecution
          description: 도구 실행 중 사용자 발화로 끼어들 수 있는지 여부입니다.
          default: false
        responseMode:
          type: string
          enum:
            - wait
            - fire_and_forget
          title: Responsemode
          description: '`wait`는 도구 완료를 기다립니다. `fire_and_forget`은 도구를 시작한 뒤 대화를 계속합니다.'
          default: wait
        toolType:
          type: string
          const: transfer_call
          title: Tool type
          description: built-in 도구 유형입니다.
        name:
          type: string
          title: Name
          description: 사람이 읽을 수 있는 리소스 이름입니다.
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: 사람이 읽을 수 있는 설명입니다.
        transferConfigurations:
          items:
            $ref: '#/components/schemas/TransferConfig'
          type: array
          title: Transfer configurations
          description: >-
            전환 대상 목록입니다. v3 API 응답은 `transferConfigurations`를 사용합니다. runtime/web
            입력의 `transferConfiguration`도 호환용으로 허용합니다.
        transferType:
          type: string
          enum:
            - cold
            - warm
          title: Transfertype
          description: >-
            통화 전환 방식입니다. `cold`는 통화를 전환하는 즉시 에이전트를 제거하고 상담사에게 안내하지 않습니다. `warm`은
            고객을 대기시키고 대화 요약 또는 고정 문장으로 상담사에게 안내한 뒤 연결합니다. 상담사가 30초 안에 받지 않으면
            에이전트가 고객 응대를 재개합니다.
          default: cold
        transferMessageType:
          type: string
          enum:
            - static
            - dynamic
          title: Transfermessagetype
          description: >-
            `warm` 전환의 상담사 안내 방식입니다. `static`은 `warmTransferStaticSentence`를 그대로
            읽습니다. `dynamic`은 `warmTransferPrompt`를 지침으로 사용해 LLM이 대화 요약을 생성합니다.
            `cold` 전환에서는 무시합니다.
          default: static
        warmTransferPrompt:
          anyOf:
            - type: string
            - type: 'null'
          title: Warmtransferprompt
          description: >-
            `warm` 전환에서 상담사에게 전달할 대화 요약을 LLM이 생성할 때 사용하는 지침입니다.
            `transferMessageType`이 `dynamic`일 때만 사용합니다.
        warmTransferStaticSentence:
          anyOf:
            - type: string
            - type: 'null'
          title: Warmtransferstaticsentence
          description: >-
            `warm` 전환 중 상담사에게 그대로 읽어 줄 문장입니다. `transferMessageType`이 `static`일
            때만 사용합니다.
        displayedCallerId:
          type: string
          enum:
            - agent
            - user
          title: Displayedcallerid
          description: >-
            `cold`와 `warm` 전환에서 상담사 전화에 표시할 발신자 번호입니다. `agent`는 vox.ai 에이전트
            전화번호를 표시하고, `user`는 현재 고객 전화번호를 표시합니다.
          default: agent
        sipHeaders:
          anyOf:
            - items:
                $ref: '#/components/schemas/TransferCallSipHeader'
              type: array
            - type: 'null'
          title: Sipheaders
          description: 전환 통화에 함께 보낼 커스텀 SIP 헤더 목록입니다. 모든 전환 대상이 `operator`이면 보낼 수 없습니다.
      type: object
      required:
        - toolType
        - name
      title: TransferCallTool
      description: 통화 전환 built-in 도구 설정입니다.
    TransferAgentTool:
      properties:
        speakDuringExecution:
          anyOf:
            - $ref: >-
                #/components/schemas/app__dto__builtin_tool__SpeakDuringExecution
            - type: 'null'
          description: 도구 실행 중 재생할 발화 메시지입니다.
        allowInterruptionDuringExecution:
          type: boolean
          title: Allowinterruptionduringexecution
          description: 도구 실행 중 사용자 발화로 끼어들 수 있는지 여부입니다.
          default: false
        responseMode:
          type: string
          enum:
            - wait
            - fire_and_forget
          title: Responsemode
          description: '`wait`는 도구 완료를 기다립니다. `fire_and_forget`은 도구를 시작한 뒤 대화를 계속합니다.'
          default: wait
        toolType:
          type: string
          const: transfer_agent
          title: Tool type
          description: built-in 도구 유형입니다.
        name:
          type: string
          title: Name
          description: 사람이 읽을 수 있는 리소스 이름입니다.
        agent:
          $ref: '#/components/schemas/AgentMapping'
          description: >-
            `agent_id`와 `agent_version`을 담는 에이전트 매핑 객체입니다. 통화·캠페인·전화번호의 교차 리소스
            참조와 `builtInTools.transfer_agent`, flow `transferAgent` 노드의
            `data.agent`에서 사용합니다.
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: 사람이 읽을 수 있는 설명입니다.
        preserveChatContext:
          type: boolean
          title: Preservechatcontext
          description: 대상 에이전트가 이전 대화 컨텍스트를 받을지 여부입니다.
          default: false
      type: object
      required:
        - toolType
        - name
        - agent
      title: TransferAgentTool
      description: 에이전트 전환 built-in 도구 설정입니다.
    SendSmsTool:
      properties:
        speakDuringExecution:
          anyOf:
            - $ref: >-
                #/components/schemas/app__dto__builtin_tool__SpeakDuringExecution
            - type: 'null'
          description: 도구 실행 중 재생할 발화 메시지입니다.
        allowInterruptionDuringExecution:
          type: boolean
          title: Allowinterruptionduringexecution
          description: 도구 실행 중 사용자 발화로 끼어들 수 있는지 여부입니다.
          default: false
        responseMode:
          type: string
          enum:
            - wait
            - fire_and_forget
          title: Responsemode
          description: >-
            `wait`는 SMS 발송 결과를 기다린 뒤 대화를 진행합니다. `fire_and_forget`은 발송 요청만 보내고
            결과를 기다리지 않은 채 대화를 계속 진행합니다.
          default: wait
        toolType:
          type: string
          const: send_sms
          title: Tool type
          description: built-in 도구 유형입니다.
        name:
          type: string
          title: Name
          description: 사람이 읽을 수 있는 리소스 이름입니다.
        toolCallSound:
          anyOf:
            - type: string
              enum:
                - none
                - typing
                - elevator_1
                - elevator_2
                - elevator_3
                - elevator_4
            - type: 'null'
          title: Toolcallsound
          description: >-
            도구 실행 중 통화가 조용해지지 않도록 재생하는 소리입니다. 생략하거나 `none`을 선택하면 재생하지 않습니다.
            `typing` 또는 `elevator_1`부터 `elevator_4`까지의 프리셋을 선택할 수 있습니다.
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: 사람이 읽을 수 있는 설명입니다.
        smsMessageType:
          type: string
          enum:
            - static
            - dynamic
          title: Smsmessagetype
          description: >-
            SMS 본문 생성 방식입니다. `static`은 설정한 제목·본문·이미지 file key를 보내고, `dynamic`은
            `smsMessagePrompt`로 에이전트가 본문을 생성합니다.
          default: static
        smsMessageStaticSentence:
          anyOf:
            - type: string
            - type: 'null'
          title: Smsmessagestaticsentence
          description: >-
            `smsMessageType=static`일 때 사용할 고정 메시지 본문입니다. 제목이나 이미지 file key와 함께
            LMS/MMS로 전송됩니다.
        smsMessageStaticTitle:
          anyOf:
            - type: string
            - type: 'null'
          title: Smsmessagestatictitle
          description: >-
            `smsMessageType=static`일 때 사용할 선택적 제목입니다. 제목 없이 보내려면 생략하거나 null로
            보냅니다.
        smsMessageStaticImageFileKeys:
          anyOf:
            - items:
                type: string
              type: array
              maxItems: 3
            - type: 'null'
          title: Smsmessagestaticimagefilekeys
          description: >-
            MMS 이미지 첨부 file key 목록입니다. 파일 업로드 API가 반환한 opaque `file_key` 문자열을 최대
            3개까지 보낼 수 있습니다. 텍스트만 보내려면 생략하거나 null로 보냅니다.
        smsMessagePrompt:
          anyOf:
            - type: string
            - type: 'null'
          title: Smsmessageprompt
          description: '`smsMessageType=dynamic`일 때 에이전트가 SMS 본문을 생성하는 데 사용할 프롬프트입니다.'
        smsFromNumber:
          anyOf:
            - type: string
            - type: 'null'
          title: Smsfromnumber
          description: >-
            SMS 발신번호 override입니다. 조직이 보유한 SMS 발신 가능 번호여야 합니다. 생략하거나 null이면 통화
            context 기본값을 사용합니다.
      type: object
      required:
        - toolType
        - name
      title: SendSmsTool
      description: SMS 전송 built-in 도구 설정입니다.
    SendDtmfTool:
      properties:
        toolType:
          type: string
          const: send_dtmf
          title: Tool type
          description: built-in 도구 유형입니다.
        name:
          type: string
          title: Name
          description: 사람이 읽을 수 있는 리소스 이름입니다.
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: 사람이 읽을 수 있는 설명입니다.
        speakDuringExecution:
          anyOf:
            - $ref: >-
                #/components/schemas/app__dto__builtin_tool__SpeakDuringExecution
            - type: 'null'
          description: 도구 실행 중 재생할 발화 메시지입니다.
        responseMode:
          type: string
          enum:
            - wait
            - fire_and_forget
          title: Responsemode
          description: '`wait`는 도구 완료를 기다립니다. `fire_and_forget`은 도구를 시작한 뒤 대화를 계속합니다.'
          default: wait
        allowInterruption:
          type: boolean
          title: Allowinterruption
          description: >-
            DTMF 도구 실행 중 사용자 발화로 끼어들 수 있는지 여부입니다. 입력에서는 runtime/web의
            `allowInterruptionDuringExecution`도 허용합니다.
          default: true
      type: object
      required:
        - toolType
        - name
      title: SendDtmfTool
      description: DTMF 전송 built-in 도구 설정입니다.
    SearchAddressTool:
      properties:
        speakDuringExecution:
          $ref: '#/components/schemas/app__dto__builtin_tool__SpeakDuringExecution'
          description: 도구 실행 중 사용자에게 재생할 TTS 메시지를 설정합니다.
        allowInterruptionDuringExecution:
          type: boolean
          title: Allowinterruptionduringexecution
          description: 도구 실행 중 사용자의 발화 끼어들기를 허용할지 설정합니다.
          default: false
        responseMode:
          type: string
          enum:
            - wait
            - fire_and_forget
          title: Responsemode
          description: '`wait`는 도구 완료를 기다립니다. `fire_and_forget`은 도구를 시작한 뒤 대화를 계속합니다.'
          default: wait
        toolType:
          type: string
          const: search_address
          title: Tool type
          description: built-in 도구 유형입니다.
        name:
          type: string
          title: Name
          description: 사람이 읽을 수 있는 리소스 이름입니다.
        toolCallSound:
          anyOf:
            - type: string
              enum:
                - none
                - typing
                - elevator_1
                - elevator_2
                - elevator_3
                - elevator_4
            - type: 'null'
          title: Toolcallsound
          description: >-
            도구 실행 중 통화가 조용해지지 않도록 재생하는 소리입니다. 생략하거나 `none`을 선택하면 재생하지 않습니다.
            `typing` 또는 `elevator_1`부터 `elevator_4`까지의 프리셋을 선택할 수 있습니다.
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: 도구의 역할과 호출 조건을 설명합니다. LLM이 이 설명을 바탕으로 도구 호출 여부를 판단합니다.
          default: >-
            Search Korean address candidates using OpenSearch and Kakao Local
            API. Use this when the caller provides Korean address clues such as
            region, road name and building number, jibun, or building/place
            name. The tool returns candidates, evidence, recommended_action, and
            timings; it does not confirm or commit the address.
      type: object
      required:
        - toolType
        - name
      title: SearchAddressTool
    SkillTool-Output:
      properties:
        speakDuringExecution:
          anyOf:
            - $ref: >-
                #/components/schemas/app__dto__builtin_tool__SpeakDuringExecution
            - type: 'null'
          description: 도구 실행 중 재생할 발화 메시지입니다.
        allowInterruptionDuringExecution:
          type: boolean
          title: Allowinterruptionduringexecution
          description: 도구 실행 중 사용자 발화로 끼어들 수 있는지 여부입니다.
          default: false
        responseMode:
          type: string
          enum:
            - wait
            - fire_and_forget
          title: Responsemode
          description: '`wait`는 도구 완료를 기다립니다. `fire_and_forget`은 도구를 시작한 뒤 대화를 계속합니다.'
          default: wait
        toolType:
          type: string
          const: skill
          title: Tool type
          description: 기본 도구 타입입니다.
        name:
          type: string
          title: Name
          description: 사람이 읽을 수 있는 리소스 이름입니다.
        toolCallSound:
          anyOf:
            - type: string
              enum:
                - none
                - typing
                - elevator_1
                - elevator_2
                - elevator_3
                - elevator_4
            - type: 'null'
          title: Toolcallsound
          description: >-
            도구 실행 중 통화가 조용해지지 않도록 재생하는 소리입니다. 생략하거나 `none`을 선택하면 재생하지 않습니다.
            `typing` 또는 `elevator_1`부터 `elevator_4`까지의 프리셋을 선택할 수 있습니다.
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: 사람이 읽을 수 있는 설명입니다.
        skill:
          $ref: '#/components/schemas/SkillPayload'
          description: 스킬 페이로드입니다. v3 API 필드는 `skill`이며, 통화 실행 시에는 `skillPayload`로 저장됩니다.
      type: object
      required:
        - toolType
        - name
        - skill
      title: SkillTool
    ErrorDetail:
      type: object
      required:
        - code
        - message
        - details
      title: ErrorDetail
      description: 기계가 읽을 수 있는 v3 오류 상세 정보입니다.
      examples:
        - code: VALIDATION_ERROR
          message: Request validation failed.
          details:
            field: name
            reason: must not be blank
      properties:
        code:
          type: string
          title: Code
          description: 기계가 읽을 수 있는 오류 code입니다. message parsing 대신 이 값을 사용합니다.
          examples:
            - VALIDATION_ERROR
        message:
          type: string
          title: Message
          description: 사용자에게 표시할 수 있는 오류 메시지입니다. 프로그램 처리는 `code`를 사용합니다.
          examples:
            - Request validation failed.
        details:
          type: object
          title: Details
          additionalProperties: true
          description: 구조화된 context입니다. 주로 `field`, `reason`, `allowed_values`를 포함합니다.
    app__dto__builtin_tool__SpeakDuringExecution:
      properties:
        enabled:
          type: boolean
          title: Enabled
          default: false
          description: 이 설정을 사용할지 여부입니다.
        messages:
          items:
            type: string
          type: array
          title: Messages
          description: 도구 실행 중 재생할 메시지입니다.
      type: object
      title: SpeakDuringExecution
      description: 도구 실행 중 재생할 발화 메시지입니다.
    TransferConfig:
      properties:
        transferTo:
          type: string
          title: Transferto
          description: >-
            전환할 전화번호 또는 SIP URI입니다. `transferType`이 `operator`이면 실제 연결 대상이 아니라
            운영자에게 표시할 이름입니다.
        transferCondition:
          anyOf:
            - type: string
            - type: 'null'
          title: Transfercondition
          description: 이 전환 대상을 사용할 조건입니다.
        transferType:
          type: string
          enum:
            - phone
            - sip
            - operator
          title: Transfertype
          description: >-
            대상 타입입니다. 기본값은 agent-server runtime과 같은 `phone`입니다. `operator`는 인계
            제어면을 통해 실시간 운영자에게 연결합니다. 웜 전환만 지원하며 `transferTo`는 표시용 이름입니다.
          default: phone
      type: object
      required:
        - transferTo
      title: TransferConfig
      description: '`transfer_call`의 전환 대상입니다.'
    TransferCallSipHeader:
      properties:
        name:
          type: string
          maxLength: 128
          minLength: 3
          pattern: ^X-[A-Za-z0-9-]+$
          title: Name
          description: >-
            SIP 헤더 이름입니다. `X-`로 시작해야 하며, 3~128자이고 `X-[A-Za-z0-9-]+` 패턴을 따라야 합니다.
            예약된 시스템 헤더는 사용할 수 없습니다.
        value:
          type: string
          maxLength: 256
          minLength: 1
          title: Value
          description: SIP 헤더 값입니다. 1~256자여야 하며, 탭을 제외한 제어 문자나 줄바꿈 문자를 포함할 수 없습니다.
      type: object
      required:
        - name
        - value
      title: TransferCallSipHeader
      description: '`transfer_call`에 사용할 SIP 헤더 키-값 쌍입니다.'
    AgentMapping:
      additionalProperties: false
      description: >-
        `agent_id`와 `agent_version` 매핑입니다.


        요청·응답 모두에서 에이전트 매핑이 필요한 경우 이 타입을 사용합니다. version 지정이 필요 없는 엔드포인트는 flat
        `agent_id: UUID`를 직접 받고 `AgentMapping`을 사용하지 않습니다.
      properties:
        agent_id:
          description: 에이전트 UUID입니다.
          format: uuid
          title: Agent Id
          type: string
        agent_version:
          default: current
          description: >-
            에이전트 버전입니다. 허용값은 "current", "production", "v{n}"(n≥1)입니다. 보내지 않으면
            "current"로 처리합니다. null 전송은 거부합니다.
          title: Agent Version
          type: string
          pattern: ^(current|production|v[1-9][0-9]*)$
          examples:
            - current
            - production
            - v1
      required:
        - agent_id
      title: AgentMapping
      type: object
    SkillPayload:
      properties:
        skills:
          items:
            $ref: '#/components/schemas/SkillItem'
          type: array
          minItems: 1
          title: Skills
          description: 이 메타 도구에서 사용할 수 있는 스킬 목록입니다. 최소 1개가 필요합니다.
        initSkillId:
          anyOf:
            - type: string
            - type: 'null'
          title: Initskillid
          description: LLM이 다른 스킬을 선택하기 전에 먼저 시작할 선택적 스킬 ID입니다.
        initSkillName:
          anyOf:
            - type: string
            - type: 'null'
          title: Initskillname
          description: LLM이 다른 스킬을 선택하기 전에 먼저 시작할 선택적 스킬 이름입니다.
      type: object
      required:
        - skills
      title: SkillPayload
      description: Skill 호출 payload.
    SkillItem:
      properties:
        id:
          anyOf:
            - type: string
            - type: 'null'
          title: Id
          description: 이 도구 안에서 고유한 스킬 식별자입니다.
        name:
          type: string
          title: Name
          description: LLM에 노출되는 스킬 이름입니다.
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: LLM이 이 스킬을 사용해야 하는 조건입니다.
        content:
          type: string
          title: Content
          description: 이 스킬이 실행할 프롬프트 또는 지시문입니다.
      type: object
      required:
        - name
        - content
      title: SkillItem
      description: '`skill` 기본 도구 안에 들어가는 단일 스킬 정의입니다.'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Organization API key
      description: '조직 API 키를 `Authorization: Bearer <token>` 형식으로 보냅니다.'

````