# 타입

> @nodaro/sdk가 내보내는 모든 TypeScript 타입, 헬퍼 함수, 상수를 리소스별로 묶고, 각각을 설명하는 페이지와 함께 안내합니다.

Source: https://nodaro.ai/ko/docs/developers/sdk/types

<strong>`@nodaro/sdk`</strong>는 대부분의 메서드 입력과 출력에 대한 TypeScript 타입과 함께, 몇 가지 헬퍼 함수와 상수를 내보냅니다. 타입은 `import type`으로 가져오세요. 그러면 번들에 아무것도 추가되지 않습니다.

```ts

const { data }: { data: Workflow } = await client.workflows.get(id)
```

타입은 API의 전송 형식을 따릅니다. `Job`은 API가 그렇게 보내기 때문에 `output_data`, `created_at` 같은 snake_case 필드를 씁니다. `Workflow`와 `WorkflowExecution`은 camelCase를 씁니다. 오브젝트 타입인 `Object`는 JavaScript 전역 객체와 이름이 같으므로, 둘 다 필요할 때는 다른 이름으로 가져오세요: `import type { Object as NodaroObject } from "@nodaro/sdk"`.

메서드가 쓰는 타입 중 일부는 내보내지 않습니다. `PipelineInput`이나 `CommunityFullDetail`처럼 `@nodaro/shared`에 정의된 타입은 그곳에서 가져옵니다. `@nodaro/shared`를 SDK가 쓰는 버전 범위로 내 의존성에 추가하면 사본이 하나만 설치됩니다. `PipelineRecord` 같은 그 밖의 타입은 그 타입을 반환하는 메서드에서 도출하세요.

```ts

type PipelineRecord = Awaited<ReturnType<NodaroClient["pipelines"]["get"]>>
```

## 클라이언트, 인증, 오류
| 내보내는 항목 | 종류 | 설명 페이지 |
| --- | --- | --- |
| `createClient`, `NodaroClient` | 함수, 클래스 | [클라이언트](https://nodaro.ai/docs/developers/sdk/client) |
| `ClientOptions`, `UserIdentity`, `MeOrganizations`, `ConnectedApp` | 타입 | [클라이언트](https://nodaro.ai/docs/developers/sdk/client) |
| `Auth`, `StaticTokenAuth`, `CallbackAuth`, `supabaseAuth` | 타입, 클래스, 함수 | [인증](https://nodaro.ai/docs/developers/sdk/auth) |
| `createSharedSupabaseClient` | 함수, `@nodaro/sdk/supabase`에서 제공 | [인증](https://nodaro.ai/docs/developers/sdk/auth#createsharedsupabaseclientoptions) |
| `NodaroError`, `UnauthorizedError`, `ForbiddenError`, `NotFoundError`, `RateLimitedError`, `InsufficientCreditsError`, `StorageExceededError`, `WorkflowConflictError`, `JobBlockedError`, `JobFailedError`, `JobTimeoutError`, `JobAbortedError`, `JobHeldError`, `StudioOpError`, `StudioPreviewUnavailable`, `StudioPreviewAppliedError` | 클래스 | [오류](https://nodaro.ai/docs/developers/sdk/errors) |
| `WorkflowConflictCode`, `throwFromResponse` | 타입, 함수 | [오류](https://nodaro.ai/docs/developers/sdk/errors) |

## 워크플로, 실행, 노드
| 내보내는 항목 | 설명 페이지 |
| --- | --- |
| `Workflow`, `ListWorkflowsParams`, `CreateWorkflowInput`, `UpdateWorkflowInput`, `RunWorkflowParams`, `RunWorkflowResult`, `RenderFinalParams`, `RenderFinalQuote` | [워크플로와 프로젝트](https://nodaro.ai/docs/developers/sdk/workflows) |
| `Project`, `CreateProjectInput`, `UpdateProjectInput` | [워크플로와 프로젝트](https://nodaro.ai/docs/developers/sdk/workflows) |
| `GenerationSession`, `SessionItem`, `SessionPage`, `CreateSessionInput`, `UpdateSessionInput`, `ListSessionsParams`, `ListSessionItemsParams`, `GenerationSessionParams` | [워크플로와 프로젝트](https://nodaro.ai/docs/developers/sdk/workflows#clientsessions) |
| `GenericNode`, `GenericEdge`, `WorkflowExport`, `WorkflowExportCharacter`, `WorkflowExportObject`, `WorkflowExportLocation` | [워크플로와 프로젝트](https://nodaro.ai/docs/developers/sdk/workflows) |
| `Job`, `JobStatus`, `JobStatusResult`, `JobErrorHint`, `SafetyBlockHint`, `PolicyBlockHint`, `CreditStatus`, `CancelJobResult`, `DeleteJobResult`, `ListJobsParams`, `ListJobsPage`, `JobRating`, `JobRatingFilter`, `RateJobResult` | [작업과 실행](https://nodaro.ai/docs/developers/sdk/jobs-and-executions) |
| `WebhookEndpoint`, `CreateWebhookEndpointInput`, `UpdateWebhookEndpointInput`, `CreatedWebhookEndpoint`, `RotateWebhookSecretInput`, `RotatedWebhookSecret`, `WebhookDelivery`, `WebhookDeliveryPage`, `ListWebhookDeliveriesParams`, `WebhookJobEvent`, `WebhookEventType`, `WebhookDeliveryStatus`, `WebhookEvent`, `JobWebhookEvent`, `PingWebhookEvent`, `WebhookSignatureError`, `VerifyWebhookSignatureOptions`, `WebhookSignatureErrorCode` | [작업과 실행](https://nodaro.ai/docs/developers/sdk/jobs-and-executions#clientwebhooks) |
| `WorkflowExecution`, `WorkflowExecutionSummary`, `NodeExecutionState`, `NodeExecutionStatus`, `ExecutionStatus`, `ExecutionOutcome`, `ExecutionTriggerType`, `ListExecutionsForWorkflowParams`, `ListExecutionsPage`, `CancelExecutionParams` | [작업과 실행](https://nodaro.ai/docs/developers/sdk/jobs-and-executions) |
| `StopVideoProResult`, `ContinueVideoProResult` | [작업과 실행](https://nodaro.ai/docs/developers/sdk/jobs-and-executions#clientvideopro) |
| `NodeDescriptor`, `NodeCategory`, `OutputType`, `NodeInputField`, `NodeInputSchema` | [노드 실행](https://nodaro.ai/docs/developers/sdk/nodes) |
| `RunNodeResult`, `RunNodeAdjustment`, `RunNodeWarning`, `NodeJobOutput`, `JobOutputImage`, `RunAndWaitOptions`, `RunManyResult`, `GenerateImageBatchResult`, `GenerateImageBatchOutput`, `BatchJobOutcome` | [노드 실행](https://nodaro.ai/docs/developers/sdk/nodes) |
| `GenerateImageParams`, `GenerateVideoParams`, `TextToVideoParams`, `StructuredReferenceParams`, `ConnectedReference`, `DescribedReference` | [노드 실행](https://nodaro.ai/docs/developers/sdk/nodes#typed-parameters) |
| `PromptAffixFields` | [앞뒤 텍스트](https://nodaro.ai/docs/concepts/prompt-pre-post-text)의 노드 데이터 필드: `promptPrefix`와 `promptSuffix` |
| `PublishedApp`, `PublishedAppDetail`, `ListAppsParams`, `ListAppsResult`, `AppRunResult`, `RunAppOptions`, `AppRun`, `ListAppRunsParams`, `DeleteAppRunResult` | [앱과 템플릿](https://nodaro.ai/docs/developers/sdk/apps-and-templates) |
| `Template`, `TemplateBrowseCard`, `TemplateSort`, `BrowseTemplatesParams`, `BrowseTemplatesResult`, `CloneTemplateParams`, `CloneTemplateResult` | [앱과 템플릿](https://nodaro.ai/docs/developers/sdk/apps-and-templates) |
| `TutorialCategory`, `TutorialVideoItem`, `TutorialFlowItem` | [앱과 템플릿](https://nodaro.ai/docs/developers/sdk/apps-and-templates#clienttutorials) |
| `LlmStructuredInput`, `LlmStructuredResult`, `LlmStructuredJobInput`, `LlmStructuredJobOutput` | [LLM과 Reduce](https://nodaro.ai/docs/developers/sdk/llm-and-reduce) |
| `ReduceStrategyId`, `ReduceMeta`, `ReduceInput`, `ReduceResult` | [LLM과 Reduce](https://nodaro.ai/docs/developers/sdk/llm-and-reduce) |

## 미디어, 보이스, 편집
| 내보내는 항목 | 설명 페이지 |
| --- | --- |
| `UploadResult`, `LibraryAsset`, `ListLibraryParams`, `ListLibraryResult` | [미디어와 업로드](https://nodaro.ai/docs/developers/sdk/media-and-uploads) |
| `GalleryItem`, `GalleryMediaType`, `BrowseGalleryParams`, `GalleryPage`, `ToggleFavoriteResult` | [미디어와 업로드](https://nodaro.ai/docs/developers/sdk/media-and-uploads#clientgallery) |
| `VideoMetadata`, `DownloadVideoProgress`, `MediaProcessInput`, `MediaProcessResult`, `OverlayPlacement` | [미디어와 업로드](https://nodaro.ai/docs/developers/sdk/media-and-uploads) |
| `AddCaptionsInput`, `CaptionLookInput`, `CaptionSegmentInput`, `CaptionEntry` | [미디어와 업로드](https://nodaro.ai/docs/developers/sdk/media-and-uploads#mediaaddcaptionsinput) |
| `Voice`, `SharedVoice`, `VoiceClone`, `VoiceLibraryParams`, `VoiceLibraryResponse` | [보이스와 오디오](https://nodaro.ai/docs/developers/sdk/voices-and-audio) |
| `VoiceChangerProInput`, `VoiceChangerProVoice`, `VcpAnalyzeInput`, `VcpAnalysis`, `VcpAnalysisSpeaker`, `VcpExportInput`, `VcpExportTrack` | [보이스와 오디오](https://nodaro.ai/docs/developers/sdk/voices-and-audio#voicesrecastinput) |
| `VoiceDesignInput`, `VoiceRemixInput`, `DubbingInput`, `AudioFxPreset` | [보이스와 오디오](https://nodaro.ai/docs/developers/sdk/voices-and-audio) |
| `TranscribeWord`, `TranscribeJobOutput`, `TranscribeProvider`, `TranscribeLane` | [보이스와 오디오](https://nodaro.ai/docs/developers/sdk/voices-and-audio#audiotranscribeinput) |
| `EditJobResult`, `SilenceDetectInput`, `SilenceRanges`, `AudioSyncInput`, `AudioSyncSource`, `AudioSyncOffset`, `AudioSyncResult`, `ApplyEdlInput`, `EditPlanInput`, `EditPlanSource`, `EditPlanMode`, `EditPlanTier`, `Edl`, `EdlClipSet`, `ChapterSet`, `Transcript`, `TightenEpisodeInput`, `TightenEpisodeJobResult`, `TightenEpisodeEstimate`, `UseCaseContinueInput` | [편집](https://nodaro.ai/docs/developers/sdk/editing) |
| `GenerateScene3DParams`, `EditScene3DParams`, `RenderScene3DParams`, `Scene3DJobOutput`, `Scene3DCapabilities`, `Scene3DAuthoringEngine`, `RetainedScene3DEditParams`, `RetainedScene3DEditResult`, `Scene3DDelivery`, `Scene3DDeliveryAsset`, `Scene3DDeliveryAssetKind` | [3D 장면](https://nodaro.ai/docs/developers/sdk/scenes-3d) |

## 에셋
| 내보내는 항목 | 설명 페이지 |
| --- | --- |
| `Character`, `CharacterDetail`, `CharacterUsage`, `ReferencePhoto`, `ReferencePhotoKind`, `UpsertCharacterInput`, `UpsertCharacterResult`, `ListCharactersParams`, `ListCharactersResult`, `DuplicateCharacterInput`, `GenerateCharacterInput`, `GenerateCharacterResult`, `GenerateAssetInput`, `GenerateMotionInput`, `ApprovePortraitResult`, `RecaptionResult`, `CharacterAspectRatio`, `EntityStyle`, `TrainCharacterInput`, `TrainCharacterResult`, `CharacterTrainingStatus`, `CharacterTrainingState`, `TrainCharacterRefusalCode` | [캐릭터](https://nodaro.ai/docs/developers/sdk/characters) |
| `Location`, `LocationDetail`, `LocationReferencePhoto`, `LocationReferencePhotoKind`, `CreateLocationInput`, `UpdateLocationInput`, `UpdateLocationResult`, `ListLocationsParams`, `GenerateLocationInput`, `GenerateLocationResult`, `GenerateLocationAssetInput`, `GenerateSurroundContinuationInput`, `ApproveMainImageResult`, `RecaptionLocationResult`, `LocationAssetType`, `LocationAttachColumn`, `SurroundDirection` | [장소](https://nodaro.ai/docs/developers/sdk/locations) |
| `Object`, `ObjectDetail`, `ObjectCategory`, `ObjectReferencePhoto`, `ObjectReferencePhotoKind`, `CreateObjectInput`, `UpdateObjectInput`, `UpdateObjectResult`, `UpsertObjectInput`, `UpsertObjectResult`, `ListObjectsParams`, `GenerateObjectInput`, `GenerateObjectResult`, `GenerateObjectAssetInput`, `GenerateObjectAssetResult`, `GenerateObjectMotionInput`, `GenerateObjectMotionResult`, `ApproveObjectMainImageResult`, `RecaptionObjectResult`, `ObjectAssetType`, `ObjectAttachColumn`, `ObjectAspectRatio` | [오브젝트와 크리처](https://nodaro.ai/docs/developers/sdk/objects-and-creatures) |
| `Creature`, `CreatureDetail`, `CreatureReferencePhoto`, `CreatureReferencePhotoKind`, `CreateCreatureInput`, `UpdateCreatureInput`, `UpdateCreatureResult`, `UpsertCreatureInput`, `UpsertCreatureResult`, `ListCreaturesParams`, `GenerateCreatureInput`, `GenerateCreatureResult`, `GenerateCreatureAssetInput`, `GenerateCreatureAssetResult`, `GenerateCreatureMotionInput`, `GenerateCreatureMotionResult`, `ApproveCreatureMainImageResult`, `RecaptionCreatureResult`, `CreatureAssetType`, `CreatureAttachColumn`, `CreatureAspectRatio` | [오브젝트와 크리처](https://nodaro.ai/docs/developers/sdk/objects-and-creatures#clientcreatures) |
| `CommunityCard`, `CommunityEntityType`, `CommunitySort`, `CommunityReportReason`, `BrowseCommunityParams`, `BrowseCommunityResult`, `CloneListingResult`, `FavoriteListingResult`, `ReportListingResult` | [커뮤니티 라이브러리](https://nodaro.ai/docs/developers/sdk/community) |

## 프로덕션
| 내보내는 항목 | 설명 페이지 |
| --- | --- |
| `StudioProduction`, `StudioProductionDetail`, `StudioSkillResponse`, `StudioValidatePlanResponse`, `StudioPlanIssue`, `StudioListProductionsResponse`, `ListStudioProductionsOptions`, `GetProductionOptions`, `StudioExportPlanOptions`, `StudioExportPlanResponse`, `StudioExportStep` | [스튜디오 프로덕션](https://nodaro.ai/docs/developers/sdk/studio) |
| `StudioCreateProductionRequest`, `StudioProductionResponse`, `StudioImportSummary`, `StudioClientRequestId`, `StudioOpsRequest`, `StudioOpsResponse`, `StudioOpsReceipt`, `StudioOpsImpact`, `StudioOpClass`, `StudioOpsDryRunReceipt`, `StudioOpsDryRunResponse`, `StudioReconcileResponse` | [스튜디오 프로덕션](https://nodaro.ai/docs/developers/sdk/studio#productionsopsproductionid-input) |
| `StudioGenerateRequest`, `StudioGenerateOptions`, `StudioGenerateResult`, `StudioGenerateEstimate`, `StudioGenerateResponse`, `StudioVideoLane`, `StudioDescribeRequest`, `StudioFrameRequest`, `StudioVoiceRequest`, `StudioRevoiceRequest`, `StudioMusicRequest`, `StudioMediaResponse`, `StudioJobStartedResponse`, `StudioCloneRequest` | [스튜디오 프로덕션](https://nodaro.ai/docs/developers/sdk/studio#generate-stills-and-clips) |
| `StudioProductionCapabilities`, `StudioKeyframeRecord`, `StudioProductionRecord`, `StudioProductionReply`, `StudioEditInput`, `StudioKeyframeGenerationInput`, `StudioKeyframeAcceptanceInput`, `StudioShotGenerationInput`, `StudioGenerationReply`, `StudioDocumentJson` | [스튜디오 프로덕션](https://nodaro.ai/docs/developers/sdk/studio#clientstudio-planned-frames) |
| `Shot`, `ShotMode`, `ShotEntityRef`, `CreateShotInput`, `UpdateShotInput` | [스튜디오 프로덕션](https://nodaro.ai/docs/developers/sdk/studio#clientshots) |
| `CreateRecastInput`, `EstimateRecastInput`, `RecastEstimate`, `RecastRunSnapshot`, `ResolveRecastGateInput`, `RecastScriptValidation`, `RecastScriptValidationError`, `RecastScriptImportResult` | [Recast](https://nodaro.ai/docs/developers/sdk/recast) |
| `RecastAudioManifestV1`, `RecastAudioLayerName`, `RecastAudioMix`, `RecastAudioMixControl`, `RecastAudioSectionReplacement`, `RecastRescoreReplacement`, `RecastRescoreOperation`, `EstimateRecastRescoreInput`, `RecastRescoreRequestV2`, `RecastRescoreQuote`, `RecastRescoreResponse` | [Recast](https://nodaro.ai/docs/developers/sdk/recast#change-the-music-mix) |
| `PipelineStageName`, `BranchPipelineInput`, `BranchPipelineResult`, `ChatTurn`, `ChatStageResult`, `ApplyChatProposalResult` | [파이프라인](https://nodaro.ai/docs/developers/sdk/pipelines) |
| `CopilotThread`, `CopilotThreadWorkflow`, `CopilotSurface`, `CopilotRunMode`, `CopilotModelTier`, `CopilotMessage`, `CopilotMessagePart`, `CreateCopilotThreadInput`, `CopilotStreamOptions`, `CopilotStreamFrame` 및 프레임 데이터 타입 | [Copilot](https://nodaro.ai/docs/developers/sdk/copilot) |

## 계정과 카탈로그
| 내보내는 항목 | 설명 페이지 |
| --- | --- |
| `ModelSummary`, `ModelMaker`, `ModelsListResult`, `ListModelsOptions`, `UserBalance`, `ModelCostsResult`, `FreeGrantState`, `WelcomeOfferState`, `WelcomeOfferClaimInput`, `WelcomeOfferClaimResult` | [모델과 크레딧](https://nodaro.ai/docs/developers/sdk/models-and-credits) |
| `BillingPlansResult`, `BillingPlan`, `BillingPlanPrices`, `BillingMoney`, `BillingMonthlyPrice`, `BillingYearlyPrice`, `BillingPriceCredits`, `BillingTopUp`, `BillingSubscriptionResult`, `BillingSubscription`, `BillingSurface`, `BillingAccountSummary`, `BillingUsageCategory` | [모델과 크레딧](https://nodaro.ai/docs/developers/sdk/models-and-credits#clientbilling) |
| `PickerCatalog`, `PickerCatalogSummary`, `PickerOption`, `PickerDimension`, `PickerCatalogSection`, `GetPickerCatalogOptions` | [피커, 프리셋, 프롬프트](https://nodaro.ai/docs/developers/sdk/pickers-and-prompts) |
| `CatalogsListResponse`, `ProjectedCatalog`, `ProjectedCatalogOption`, `ProjectedCatalogDimension`, `ProjectedCatalogSection` | [피커, 프리셋, 프롬프트](https://nodaro.ai/docs/developers/sdk/pickers-and-prompts#clientcatalogs) |
| `NodePreset`, `NodePresetGroup`, `FactoryPresetsResult`, `FactoryPresetEntry`, `CreateNodePresetInput`, `UpdateNodePresetInput`, `ImportNodePresetInput`, `ReorderNodePresetsInput` | [피커, 프리셋, 프롬프트](https://nodaro.ai/docs/developers/sdk/pickers-and-prompts#clientpresets) |
| `ColorPalette`, `PalettePage`, `ListPalettesParams`, `CreatePaletteInput`, `UpdatePaletteInput`, `Moodboard`, `MoodboardPage`, `ListMoodboardsParams`, `CreateMoodboardInput`, `UpdateMoodboardInput`, `DirectionFields` | [피커, 프리셋, 프롬프트](https://nodaro.ai/docs/developers/sdk/pickers-and-prompts#clientpalettes) |
| `AnalyzeInput`, `AnalyzeResult`, `GenerateInput`, `EnhanceInput`, `PromptResult`, `WizardQuestion`, `WizardOption`, `WizardSelection`, `RecommendedModel`, `WizardNodeContext` | [피커, 프리셋, 프롬프트](https://nodaro.ai/docs/developers/sdk/pickers-and-prompts#clientprompthelper) |
| `OrganizationView`, `OrganizationSummary`, `OrgMemberView`, `OrgKind`, `OrgRole`, `OrgStatus`, `OrgSettings`, `OrgAuditEntry`, `OrgPage`, `OrgErrorCode`, `MemberStatus`, `CreateOrgInput`, `InviteInput`, `ListInvitationsOptions` | [조직과 워크스페이스](https://nodaro.ai/docs/developers/sdk/organizations) |
| `InvitationView`, `InvitationDelivery`, `InvitationPreview`, `InvitationState`, `JoinCodeView` | [조직과 워크스페이스](https://nodaro.ai/docs/developers/sdk/organizations) |
| `WorkspaceView`, `WorkspaceSummary`, `WorkspaceMemberView`, `WorkspaceRole`, `WorkspaceSettings`, `CreateWorkspaceInput` | [조직과 워크스페이스](https://nodaro.ai/docs/developers/sdk/organizations#clientworkspaces) |
| `UsageQuery`, `UsageGroupBy`, `UsageReport`, `UsageReportRow`, `UsageReportTotals`, `UsageVarianceRow`, `UsageLogEntry` | [조직과 워크스페이스](https://nodaro.ai/docs/developers/sdk/organizations#organization-usage) |
| `DeveloperApp`, `DeveloperAppScope`, `DeveloperAppStatus`, `DeveloperAppKind`, `CreateDeveloperAppInput`, `UpdateDeveloperAppInput`, `CreateDeveloperAppResult`, `RotateSecretResult` | [OAuth와 개발자 앱](https://nodaro.ai/docs/developers/sdk/developer-apps) |
| `ExchangeCodeInput`, `AccessTokenResponse`, `OAuthAppInfo` | [OAuth와 개발자 앱](https://nodaro.ai/docs/developers/sdk/developer-apps#clientoauth) |

## 헬퍼 함수와 상수
이것들은 타입이 아니라 값이므로 `type` 없이 가져오세요.

| 내보내는 항목 | 설명 |
| --- | --- |
| `nodeStateMayCarryOutput(status)`, `OUTPUT_BEARING_NODE_STATUSES` | 노드 상태가 `output`을 담을 수 있는지 여부입니다. 해당 상태는 `completed`와 `failed`입니다. [작업과 실행](https://nodaro.ai/docs/developers/sdk/jobs-and-executions#executionsgetid)을 참고하세요. |
| `executionOutcome(status, nodeStates)`, `countEmptyInputSkips(nodeStates)` | 완료된 실행이 새로운 것을 찾지 못했는지, 그리고 입력이 없어 건너뛴 노드가 몇 개인지 알려 줍니다. [작업과 실행](https://nodaro.ai/docs/developers/sdk/jobs-and-executions#executionsgetid)을 참고하세요. |
| `isStudioGenerateEstimate(result)` | 생성 견적과 시작된 실행을 구분합니다. [스튜디오 프로덕션](https://nodaro.ai/docs/developers/sdk/studio#generate-stills-and-clips)을 참고하세요. |
| `unwrapEditPlanOutput(outputData)` | 편집 계획 작업의 출력을 EDL, EDL 목록 또는 챕터로 읽습니다. [편집](https://nodaro.ai/docs/developers/sdk/editing#editeditplaninput)을 참고하세요. |
| `verifyWebhookSignature(options)` | Webhook 호출의 서명을 확인하고 이벤트를 반환합니다. [작업과 실행](https://nodaro.ai/docs/developers/sdk/jobs-and-executions#verifywebhooksignatureoptions)을 참고하세요. |
| `paletteDirectionId(id)`, `moodboardDirectionId(id)`, `PALETTE_DIRECTION_PREFIX`, `MOODBOARD_DIRECTION_PREFIX` | 팔레트나 무드보드의 `direction` 값을 만듭니다. [피커, 프리셋, 프롬프트](https://nodaro.ai/docs/developers/sdk/pickers-and-prompts#clientpalettes)를 참고하세요. |
| `throwFromResponse(status, body)` | API 응답에 맞는 오류 클래스를 발생시킵니다. [오류](https://nodaro.ai/docs/developers/sdk/errors#throwfromresponsestatus-body)를 참고하세요. |
| `PROMPT_PREFIX_KEY`, `PROMPT_SUFFIX_KEY` | 앞뒤 텍스트의 노드 데이터 키입니다. |
| `WORKSPACE_HEADER` | 워크스페이스 헤더의 이름인 `X-Nodaro-Workspace`입니다. |
| `USAGE_GROUP_BYS` | 사용량 보고서가 받는 그룹화 방식입니다. |
| `LOCATION_ASSET_TYPES`, `LOCATION_ATTACH_COLUMNS`, `SURROUND_DIRECTIONS` | 허용되는 장소 변형 유형, 컬렉션, 서라운드 방향입니다. |
| `OBJECT_ASSET_TYPES`, `OBJECT_ATTACH_COLUMNS`, `OBJECT_ASPECT_OPTIONS`, `OBJECT_ASPECT_DEFAULTS` | 허용되는 오브젝트 변형 유형, 컬렉션, 화면 비율입니다. |
| `CREATURE_ASSET_TYPES`, `CREATURE_ATTACH_COLUMNS`, `CREATURE_ASPECT_OPTIONS`, `CREATURE_ASPECT_DEFAULTS` | 크리처에 대한 같은 목록입니다. |
| `CHARACTER_STYLES`, `CHARACTER_ASPECT_OPTIONS`, `CHARACTER_ASPECT_DEFAULTS` | 캐릭터 스타일과 화면 비율입니다. |
| `SCENE3D_DELIVERY_ASSET_USAGE` | 허용되는 전달 파일 종류와 용도의 쌍입니다. |

`WorkflowsResource`나 `NodesResource` 같은 모든 리소스 클래스도 고급 타입 지정을 위해 내보냅니다. 이 클래스가 필요한 경우는 드뭅니다. `createClient`가 모든 리소스를 만들어 주기 때문입니다.

## 자주 묻는 질문

### Nodaro SDK에서 타입을 가져오려면 어떻게 하나요?

타입 이름과 함께 import type을 사용하세요. 예를 들어 import type { Workflow, Job } from @nodaro/sdk처럼 씁니다. 메서드가 쓰는 타입 중 일부는 내보내지 않습니다. 그런 타입은 @nodaro/shared에서 가져오거나 메서드에서 도출하세요.

### 어떤 필드는 snake_case이고 어떤 필드는 camelCase인 이유는 무엇인가요?

타입은 API의 전송 형식을 따릅니다. Job은 API가 그렇게 보내기 때문에 output_data, created_at 같은 snake_case를 씁니다. Workflow와 WorkflowExecution은 camelCase를 씁니다.

### @nodaro/shared도 필요한가요?

보통은 필요 없습니다. SDK는 조직 타입과 편집 타입처럼 메서드가 쓰는 공유 타입 대부분을 다시 내보냅니다. 3D 검토 헬퍼와 toConnectedReference 같은 일부 헬퍼, PipelineInput과 CommunityFullDetail 같은 일부 타입은 @nodaro/shared에서 직접 가져옵니다.
