> ## 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.

# 유닛 테스트 조회

> 유닛 테스트의 현재 정의와 실행 가능 여부를 돌려줍니다. 지난 실행에 쓴 정의가 아니라 지금 저장된 정의입니다.



## OpenAPI

````yaml /api-reference/v3/openapi.json get /evals/unit/{test_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:
  /evals/unit/{test_id}:
    get:
      tags:
        - Evals
      summary: 유닛 테스트 조회
      description: 유닛 테스트의 현재 정의와 실행 가능 여부를 돌려줍니다. 지난 실행에 쓴 정의가 아니라 지금 저장된 정의입니다.
      operationId: getUnitTest
      parameters:
        - name: test_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            description: 유닛 테스트 id입니다. GET /v3/evals/unit 응답의 id를 사용합니다.
            title: Test Id
          description: 유닛 테스트 id입니다. GET /v3/evals/unit 응답의 id를 사용합니다.
      responses:
        '200':
          description: 성공 응답
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnitTestResponse'
              example:
                id: 0f9c2b1e-3d4a-4b5c-8d6e-7f8091a2b3c4
                name: 예약 변경
                description: 예약을 찾은 뒤 바꿀 날짜를 묻는지 확인합니다.
                created_at: 1761960000000
                validation:
                  is_valid: true
                  issues: []
                messages:
                  - role: user
                    content: 예약 바꾸려고요
                  - role: tool_call_invocation
                    tool_call_id: c1
                    name: lookup_booking
                    arguments:
                      phone: '01012345678'
                    eval: null
                  - role: tool_call_result
                    tool_call_id: c1
                    content: '{"date": "11-03"}'
                  - role: agent
                    content: 11월 3일 예약 확인했어요. 언제로 바꿔 드릴까요?
                    eval:
                      expected_behavior: 확인한 예약 날짜를 말하고 바꿀 날짜를 묻는다
                flow_agent_id: null
                flow_start_node_id: null
                dynamic_variables: null
                tool_mocks: null
                metadata:
                  team: cs
        '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:
                notFound:
                  summary: 리소스를 찾을 수 없습니다.
                  value:
                    error:
                      code: RESOURCE_NOT_FOUND
                      message: Resource not found.
                      details:
                        resource: agent
        '409':
          description: 충돌이 발생했습니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                conflict:
                  summary: 상태 충돌이 발생했습니다.
                  value:
                    error:
                      code: CONFLICT
                      message: The requested operation conflicts with current state.
                      details:
                        current_status: draft
        '429':
          description: >-
            요청 한도를 초과했습니다. API 키 트래픽은 기본값으로 워크스페이스당 초당 5회·분당 120회, Supabase JWT
            트래픽은 기본값으로 사용자당 초당 10회·분당 240회로 제한되며, 워크스페이스 대시보드에는 기본 분당 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:
    UnitTestResponse:
      properties:
        id:
          type: string
          format: uuid
          title: Id
          description: 테스트 id입니다.
        name:
          type: string
          title: Name
          description: 테스트 이름입니다.
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: 테스트 설명입니다. null이면 설명이 없습니다.
        created_at:
          type: integer
          title: Created At
          description: 리소스 생성 시각입니다. unix milliseconds 형식입니다.
        validation:
          $ref: '#/components/schemas/EvalValidation'
          description: 현재 규칙으로 본 실행 가능 여부와 고칠 점입니다.
        messages:
          items:
            oneOf:
              - $ref: '#/components/schemas/UnitTestUserMessage'
              - $ref: '#/components/schemas/UnitTestAgentMessage'
              - $ref: '#/components/schemas/UnitTestToolCallInvocation'
              - $ref: '#/components/schemas/UnitTestToolCallResult'
            discriminator:
              propertyName: role
              mapping:
                agent: '#/components/schemas/UnitTestAgentMessage'
                tool_call_invocation: '#/components/schemas/UnitTestToolCallInvocation'
                tool_call_result: '#/components/schemas/UnitTestToolCallResult'
                user: '#/components/schemas/UnitTestUserMessage'
          type: array
          title: Messages
          description: >-
            검사할 대화입니다. 마지막 항목의 `eval`이 확인할 항목입니다. 규칙에 맞지 않는 항목도 저장된 그대로 보여 주고
            `validation`에 표시합니다.
        flow_agent_id:
          anyOf:
            - type: string
              format: uuid
            - type: 'null'
          title: Flow Agent Id
          description: Flow 유닛 테스트가 속한 Flow 에이전트 id입니다. 일반 에이전트용 테스트는 null입니다.
        flow_start_node_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Flow Start Node Id
          description: Flow 유닛 테스트를 시작할 노드 id입니다. 일반 에이전트용 테스트는 null입니다.
        dynamic_variables:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Dynamic Variables
          description: 실행할 때 에이전트에 넣을 동적 변수입니다.
        tool_mocks:
          anyOf:
            - items:
                oneOf:
                  - $ref: '#/components/schemas/EvalApiToolMock'
                  - $ref: '#/components/schemas/EvalMcpToolMock'
                  - $ref: '#/components/schemas/EvalFlowApiToolMock'
                discriminator:
                  propertyName: type
                  mapping:
                    api: '#/components/schemas/EvalApiToolMock'
                    flow_api: '#/components/schemas/EvalFlowApiToolMock'
                    mcp: '#/components/schemas/EvalMcpToolMock'
              type: array
            - type: 'null'
          title: Tool Mocks
          description: >-
            실행할 때 실제 도구 대신 돌려줄 도구 응답입니다. 같은 도구나 Flow 노드는 한 번만 지정합니다. null이면 정해 둔
            응답이 없습니다.
        metadata:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Metadata
          description: 테스트에 붙여 두는 사용자 정의 정보입니다. 실행에는 쓰이지 않습니다.
      type: object
      required:
        - id
        - name
        - description
        - created_at
        - validation
        - messages
        - flow_agent_id
        - flow_start_node_id
        - dynamic_variables
        - tool_mocks
        - metadata
      title: UnitTestResponse
    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입니다.
    EvalValidation:
      properties:
        is_valid:
          type: boolean
          title: Is Valid
          description: 실행할 수 있는 상태이면 true입니다.
        issues:
          items:
            $ref: '#/components/schemas/EvalValidationIssue'
          type: array
          title: Issues
          description: 실행 전에 고쳐야 할 문제 목록입니다. 실행할 수 있으면 빈 배열입니다.
      type: object
      required:
        - is_valid
        - issues
      title: EvalValidation
    UnitTestUserMessage:
      properties:
        role:
          type: string
          const: user
          title: Role
          description: 고객 발화 항목입니다.
        content:
          type: string
          title: Content
          description: 고객 발화 내용입니다.
      type: object
      required:
        - role
        - content
      title: UnitTestUserMessage
    UnitTestAgentMessage:
      properties:
        role:
          type: string
          const: agent
          title: Role
          description: 에이전트 응답 항목입니다.
        content:
          type: string
          title: Content
          description: 에이전트 응답 내용입니다. 확인할 응답이면 참고용 응답이며 비워 둘 수 있습니다.
        eval:
          anyOf:
            - $ref: '#/components/schemas/EvalAgentExpectation'
            - type: 'null'
          description: 이 항목을 확인할 응답으로 지정합니다. 마지막 항목에만 작성합니다.
      type: object
      required:
        - role
        - content
      title: UnitTestAgentMessage
    UnitTestToolCallInvocation:
      properties:
        role:
          type: string
          const: tool_call_invocation
          title: Role
          description: 에이전트의 도구 호출 항목입니다.
        tool_call_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Tool Call Id
          description: 도구 호출 id입니다. 생략하면 목록에서의 호출 순서로 `call_1`, `call_2`처럼 정합니다.
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
          description: >-
            호출한 도구 이름으로, eval이 없는 항목이나 `arguments`에 값을 쓴 항목에서는 필수이며 Manual 이력은
            정확히 `StartManual`로 작성합니다.
        arguments:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Arguments
          description: >-
            도구 호출에 보낸 값 객체입니다. eval이 없는 항목에서는 필수이며, `StartManual`의 `id`에는 Manual
            UUID를 작성합니다.
        eval:
          anyOf:
            - $ref: '#/components/schemas/EvalToolCallExpectation'
            - type: 'null'
          description: >-
            이 도구 호출을 확인할 항목으로 지정합니다. 마지막 항목에만 작성합니다. 어떤 도구를 어떤 값으로 부를지는
            `expected_behavior`에 문장으로 씁니다.
      type: object
      required:
        - role
      title: UnitTestToolCallInvocation
    UnitTestToolCallResult:
      properties:
        role:
          type: string
          const: tool_call_result
          title: Role
          description: 도구 호출 결과 항목입니다. 대응하는 tool_call_invocation 바로 다음에 둡니다.
        tool_call_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Tool Call Id
          description: 대응하는 도구 호출 id입니다. 생략하면 바로 앞 호출의 id를 씁니다.
        content:
          type: string
          title: Content
          description: >-
            도구 결과 문자열입니다. `StartManual` 결과는 `status`가 loaded, already_loaded,
            rejected, error 중 하나인 JSON 객체 문자열입니다.
      type: object
      required:
        - role
        - content
      title: UnitTestToolCallResult
    EvalApiToolMock:
      properties:
        type:
          type: string
          const: api
          title: Type
          description: 응답을 정해 둘 API 도구입니다.
        tool_id:
          type: string
          format: uuid
          title: Tool Id
          description: 응답을 정해 둘 API 도구 id입니다. GET /v3/tools 응답의 id를 사용합니다.
        response:
          oneOf:
            - $ref: '#/components/schemas/EvalToolMockJsonResponse'
            - $ref: '#/components/schemas/EvalToolMockTextResponse'
          title: Response
          description: 도구 대신 돌려줄 응답입니다. 생략하면 빈 JSON 객체 `{}`를 돌려주며, null은 쓸 수 없습니다.
          discriminator:
            propertyName: type
            mapping:
              json: '#/components/schemas/EvalToolMockJsonResponse'
              text: '#/components/schemas/EvalToolMockTextResponse'
      additionalProperties: false
      type: object
      required:
        - type
        - tool_id
      title: EvalApiToolMock
    EvalMcpToolMock:
      properties:
        type:
          type: string
          const: mcp
          title: Type
          description: 응답을 정해 둘 MCP 서버입니다.
        tool_id:
          type: string
          format: uuid
          title: Tool Id
          description: 응답을 정해 둘 MCP 연결 도구 id입니다. GET /v3/tools 응답의 id를 사용합니다.
        tools:
          items:
            $ref: '#/components/schemas/EvalMcpTool'
          type: array
          title: Tools
          description: 이 MCP 서버에서 쓸 도구 목록입니다. 도구 이름은 서로 달라야 합니다.
      additionalProperties: false
      type: object
      required:
        - type
        - tool_id
        - tools
      title: EvalMcpToolMock
    EvalFlowApiToolMock:
      properties:
        type:
          type: string
          const: flow_api
          title: Type
          description: 응답을 정해 둘 Flow API 노드입니다.
        agent_id:
          type: string
          format: uuid
          title: Agent Id
          description: 에이전트 UUID입니다.
        node_id:
          type: string
          minLength: 1
          title: Node Id
          description: 응답을 정해 둘 Flow API 노드 id입니다.
        response:
          oneOf:
            - $ref: '#/components/schemas/EvalToolMockJsonResponse'
            - $ref: '#/components/schemas/EvalToolMockTextResponse'
          title: Response
          description: 도구 대신 돌려줄 응답입니다. 생략하면 빈 JSON 객체 `{}`를 돌려주며, null은 쓸 수 없습니다.
          discriminator:
            propertyName: type
            mapping:
              json: '#/components/schemas/EvalToolMockJsonResponse'
              text: '#/components/schemas/EvalToolMockTextResponse'
      additionalProperties: false
      type: object
      required:
        - type
        - agent_id
        - node_id
      title: EvalFlowApiToolMock
    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`를 포함합니다.
    EvalValidationIssue:
      properties:
        code:
          type: string
          title: Code
          description: 문제 코드입니다. `EVAL_`로 시작합니다.
        field:
          anyOf:
            - type: string
            - type: 'null'
          title: Field
          description: '문제가 있는 위치입니다. 예: `messages[2].tool_call_id`'
        message:
          type: string
          title: Message
          description: 고칠 방법을 담은 안내 문장입니다.
      type: object
      required:
        - code
        - message
      title: EvalValidationIssue
    EvalAgentExpectation:
      properties:
        expected_behavior:
          type: string
          title: Expected Behavior
          description: 확인할 응답에서 기대하는 에이전트 행동입니다. 채점하는 AI가 실제 응답을 이 문장과 비교합니다.
        to_node_id:
          anyOf:
            - type: string
            - type: 'null'
          title: To Node Id
          description: >-
            Flow 유닛 테스트에서 확인할 agent 응답이 기대하는 전환 목적지 노드 id로, 생략하면 전환이 아닌 응답을
            기대합니다. Flow에서 null이나 빈 문자열은 목적지를 고르지 않은 초안으로 저장됩니다.
      additionalProperties: false
      type: object
      required:
        - expected_behavior
      title: EvalAgentExpectation
    EvalToolCallExpectation:
      properties:
        expected_behavior:
          type: string
          title: Expected Behavior
          description: >-
            확인할 도구 호출에서 기대하는 동작입니다. 어떤 도구를 어떤 값으로 부를지 문장으로 쓰면 채점하는 AI가 실제 호출을 이
            문장과 비교합니다.
      additionalProperties: false
      type: object
      required:
        - expected_behavior
      title: EvalToolCallExpectation
    EvalToolMockJsonResponse:
      properties:
        type:
          type: string
          const: json
          title: Type
          description: JSON 응답입니다.
        value:
          title: Value
          description: 도구 대신 돌려줄 JSON 값입니다. null도 쓸 수 있습니다.
      additionalProperties: false
      type: object
      required:
        - type
        - value
      title: EvalToolMockJsonResponse
    EvalToolMockTextResponse:
      properties:
        type:
          type: string
          const: text
          title: Type
          description: 문자열 응답입니다.
        value:
          type: string
          title: Value
          description: 도구 대신 돌려줄 문자열입니다.
      additionalProperties: false
      type: object
      required:
        - type
        - value
      title: EvalToolMockTextResponse
    EvalMcpTool:
      properties:
        name:
          type: string
          minLength: 1
          title: Name
          description: 응답을 정해 둘 MCP 도구 이름입니다.
        description:
          type: string
          title: Description
          description: 에이전트에 보여 줄 도구 설명입니다. 생략할 수 있으며 null은 쓸 수 없습니다.
        input_schema:
          additionalProperties: true
          type: object
          title: Input Schema
          description: 도구 입력의 JSON Schema입니다. `type`은 `object`여야 합니다.
        response:
          oneOf:
            - $ref: '#/components/schemas/EvalToolMockJsonResponse'
            - $ref: '#/components/schemas/EvalToolMockTextResponse'
          title: Response
          description: 도구 대신 돌려줄 응답입니다. 생략하면 빈 JSON 객체 `{}`를 돌려주며, null은 쓸 수 없습니다.
          discriminator:
            propertyName: type
            mapping:
              json: '#/components/schemas/EvalToolMockJsonResponse'
              text: '#/components/schemas/EvalToolMockTextResponse'
      additionalProperties: false
      type: object
      required:
        - name
        - input_schema
      title: EvalMcpTool
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Organization API key
      description: '워크스페이스 API 키를 `Authorization: Bearer <token>` 형식으로 보냅니다.'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.