# 변환된 사용자 프롬프트 훅

userPromptTransformed 후크는 런타임이 생성된 컨텍스트를 제출된 프롬프트에 추가한 후 실행되지만 결과 콘텐츠가 세션 기록에 유지되거나 모델로 전송되기 전에 실행됩니다.

<!-- markdownlint-disable GHD046 GHD005 -->
<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->

정확한 모델 연결 프롬프트를 검사하거나 교체해야 하는 경우 사용합니다. 입력에는 `prompt` 후크가 실행된 후 `userPromptSubmitted` 사용자 프롬프트가 포함되고 `transformedPrompt` 런타임에서 생성된 컨텍스트(예: `<current_datetime>`)도 포함됩니다.

## 입력 및 출력

| 입력 필드 | Type | Description |
| --- | --- | --- |
| `sessionId` | string | 런타임 세션 ID |
| `timestamp` | 날짜/시간 | 후크가 호출된 시간 |
| `cwd` / `workingDirectory` | string | 현재 작업 디렉터리 |
| `prompt` | string | 
`userPromptSubmitted` 후크 뒤의 프롬프트 |
| `transformedPrompt` | string | 런타임 변환 후 모델 대상 프롬프트 |

값을 반환하지 않으면 변환된 프롬프트는 변경되지 않은 상태로 유지됩니다. 세션 기록에 저장되고 모델로 전송되는 콘텐츠를 대체하기 위해 `modifiedTransformedPrompt`를 반환합니다.

## Examples

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

<!-- docs-validate: skip -->

```typescript
const session = await client.createSession({
  hooks: {
    onUserPromptTransformed: async (input) => ({
      modifiedTransformedPrompt: redact(input.transformedPrompt),
    }),
  },
});
```

</div>

<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

<!-- docs-validate: skip -->

```python
session = await client.create_session(
    hooks={
        "on_user_prompt_transformed": lambda input_data, invocation: {
            "modifiedTransformedPrompt": redact(input_data["transformedPrompt"])
        }
    }
)
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

<!-- docs-validate: skip -->

```golang
session, err := client.CreateSession(ctx, &copilot.SessionConfig{
    Hooks: &copilot.SessionHooks{
        OnUserPromptTransformed: func(input copilot.UserPromptTransformedHookInput, invocation copilot.HookInvocation) (*copilot.UserPromptTransformedHookOutput, error) {
            return &copilot.UserPromptTransformedHookOutput{
                ModifiedTransformedPrompt: copilot.String(redact(input.TransformedPrompt)),
            }, nil
        },
    },
})
```

</div>

<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

<!-- docs-validate: skip -->

```csharp
var session = await client.CreateSessionAsync(new SessionConfig
{
    Hooks = new SessionHooks
    {
        OnUserPromptTransformed = (input, invocation) =>
            Task.FromResult<UserPromptTransformedHookOutput?>(new()
            {
                ModifiedTransformedPrompt = Redact(input.TransformedPrompt),
            }),
    },
});
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

<!-- docs-validate: skip -->

```java
var hooks = new SessionHooks().setOnUserPromptTransformed((input, invocation) ->
    CompletableFuture.completedFuture(
        new UserPromptTransformedHookOutput(redact(input.transformedPrompt()))));

var session = client.createSession(new SessionConfig().setHooks(hooks)).get();
```

</div>

<div class="ghd-codetab" data-lang="rust" data-label="Rust"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Rust</div>

```rust
#[async_trait]
impl SessionHooks for MyHooks {
    async fn on_user_prompt_transformed(
        &self,
        input: UserPromptTransformedInput,
        _ctx: HookContext,
    ) -> Option<UserPromptTransformedOutput> {
        Some(UserPromptTransformedOutput {
            modified_transformed_prompt: Some(redact(&input.transformed_prompt)),
        })
    }
}

let session = client
    .create_session(SessionConfig::default().with_hooks(Arc::new(MyHooks)))
    .await?;
```

</div>

</div>

대체는 사용자 메시지 콘텐츠로 유지되므로 다시 시작된 세션에서 수정된 콘텐츠를 변경하지 않고 재생합니다.