Repository: instructor-ai/instructor
Issue category: Bug Report

Issue:
prompt_tokens_details not being populated correctly in response model
- [ - ] This is actually a bug report.
- [ ] I am not getting good LLM Results
- [ - ] I have tried asking for help in the community on discord or discussions and have not received a response.
- [ - ] I have tried searching the documentation and have not found an answer.

**What Model are you using?**

- [ -] gpt-3.5-turbo
- [ -] gpt-4-turbo
- [- ] gpt-4
- [ ] Other (please specify)

**Describe the bug**
I'm unable to see how many tokens were cached when I try to use client.chat.completions.create_with_completion. completion.usage.prompt_token_details is always completion.usage.prompt_token_details

**To Reproduce**
```python
import instructor
from time import sleep
from pydantic import BaseModel, field_validator
from openai import OpenAI
class FakeClass(BaseModel):
    insight: str
client = instructor.from_openai(OpenAI(api_key=OPENAI_API_KEY))
fake_str = "This is a Test string" * 1000

for x in range(0, 3):
    sleep(1)
    insight, completion = client.chat.completions.create_with_completion(
        model="gpt-4o",
        messages=[
            {
                "role": "system",
                "content": fake_str,
            },
            {"role": "user", "content": "Test User Prompt"},
        ],
        max_retries=1,
        response_model=FakeClass,
    )
 
    print(completion.usage.prompt_token_details.model_dump())
```

I get this:
```python 
{'audio_tokens': 0, 'cached_tokens': 0}
```

**Expected behavior**
I expect to see how many token have been cached. I know OpenAI is caching it since I tried it without wrapping it around Instructor
```python

open_ai_client = OpenAI(api_key=OPENAI_API_KEY)
open_ai_client.chat.completions.create

for x in range(0, 3):
    sleep(1)
    chat_completion = open_ai_client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "system",
                "content": fake_str,
            },
            {"role": "user", "content": "Test User Prompt"},
        ],
    )

    cached_tokens = chat_completion.usage.prompt_tokens_details.cached_tokens
    if cached_tokens == 0:
        print("No cached tokens")
    else:
        print(f"Tokens used: {cached_tokens}")
        print(chat_completion.usage.prompt_tokens_details.model_dump())
```
I get this output
```
Tokens used: 4864
{'audio_tokens': 0, 'cached_tokens': 4864}
````


**Screenshots**
If applicable, add screenshots to help explain your problem.



Hints:
This is happening due to a typo in https://github.com/instructor-ai/instructor/blob/bc7a7b3265669ca8266722bb92a437a6da64b66c/instructor/retry.py#L76

Its currently:
```python
 total_usage = CompletionUsage(completion_tokens=0, prompt_tokens=0, total_tokens=0,
        completion_tokens_details = CompletionTokensDetails(audio_tokens=0, reasoning_tokens=0),
        prompt_token_details = PromptTokensDetails(audio_tokens=0, cached_tokens=0)
    )
```
   

Its supposed to be:
```python 
total_usage = CompletionUsage(completion_tokens=0, prompt_tokens=0, total_tokens=0,
        completion_tokens_details = CompletionTokensDetails(audio_tokens=0, reasoning_tokens=0),
        prompt_tokens_details = PromptTokensDetails(audio_tokens=0, cached_tokens=0)
    )
```

notice the typo in **prompt_token_details** vs **prompt_tokens_details**
I have tested in my local and it fixes it. 


Supporting docs from OpenAI: https://github.com/openai/openai-python/blob/6e1161bc3ed20eef070063ddd5ac52fd9a531e88/src/openai/types/completion_usage.py#L53

Patch:
diff --git a/instructor/retry.py b/instructor/retry.py
index 205c7843f..853a73a54 100644
--- a/instructor/retry.py
+++ b/instructor/retry.py
@@ -73,7 +73,7 @@ def initialize_usage(mode: Mode) -> CompletionUsage | Any:
     """
     total_usage = CompletionUsage(completion_tokens=0, prompt_tokens=0, total_tokens=0,
         completion_tokens_details = CompletionTokensDetails(audio_tokens=0, reasoning_tokens=0),
-        prompt_token_details = PromptTokensDetails(audio_tokens=0, cached_tokens=0)
+        prompt_tokens_details = PromptTokensDetails(audio_tokens=0, cached_tokens=0)
     )
     if mode in {Mode.ANTHROPIC_TOOLS, Mode.ANTHROPIC_JSON}:
         from anthropic.types import Usage as AnthropicUsage


Test patch: