Skip to content

Commit 9e02668

Browse files
authored
fix(vcr): fix normalization support for Node.js OpenAI v5 (#215)
* add changes for openai v5 support * release note * update rel note
1 parent 0e2c71f commit 9e02668

7 files changed

+2836
-0
lines changed

ddapm_test_agent/vcr_proxy.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
r"--form-data-boundary-[^\r\n]+",
2121
"--form-data-boundary-normalized",
2222
), # openai file types
23+
(
24+
r"------formdata-undici-[^\r\n]+",
25+
"--form-data-boundary-normalized",
26+
), # openai file types for undici (node.js)
2327
]
2428

2529

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
fixes:
3+
- |
4+
Provider VCR: Fixes normalization support for a different form data boundary format used by the Node.js runtime.

vcr-cassettes/openai/openai_audio_transcriptions_post_173af3e5.yaml

Lines changed: 1341 additions & 0 deletions
Large diffs are not rendered by default.

vcr-cassettes/openai/openai_audio_translations_post_dd92a18a.yaml

Lines changed: 1096 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
interactions:
2+
- request:
3+
body: "------formdata-undici-019869426906\r\nContent-Disposition: form-data; name=\"purpose\"\r\n\r\nfine-tune\r\n------formdata-undici-019869426906\r\nContent-Disposition:
4+
form-data; name=\"file\"; filename=\"fine-tune.jsonl\"\r\nContent-Type: application/octet-stream\r\n\r\n{\"messages\":[{\"role\":\"user\",\"content\":\"What
5+
is the meaning of life?\"},{\"role\":\"assistant\",\"content\":\"The meaning
6+
of life is 42\"}]}\n{\"messages\":[{\"role\":\"user\",\"content\":\"What is
7+
5 + 5?\"},{\"role\":\"assistant\",\"content\":\"5 + 5 equals 10\"}]}\n{\"messages\":[{\"role\":\"user\",\"content\":\"What
8+
is the capital of France?\"},{\"role\":\"assistant\",\"content\":\"The capital
9+
of France is Paris\"}]}\n{\"messages\":[{\"role\":\"user\",\"content\":\"What
10+
is the largest planet in our solar system?\"},{\"role\":\"assistant\",\"content\":\"Jupiter
11+
is the largest planet in our solar system\"}]}\n{\"messages\":[{\"role\":\"user\",\"content\":\"How
12+
many sides does a triangle have?\"},{\"role\":\"assistant\",\"content\":\"A
13+
triangle has three sides\"}]}\n{\"messages\":[{\"role\":\"user\",\"content\":\"What
14+
is the chemical symbol for gold?\"},{\"role\":\"assistant\",\"content\":\"The
15+
chemical symbol for gold is Au\"}]}\n{\"messages\":[{\"role\":\"user\",\"content\":\"What
16+
is the opposite of hot?\"},{\"role\":\"assistant\",\"content\":\"The opposite
17+
of hot is cold\"}]}\n{\"messages\":[{\"role\":\"user\",\"content\":\"How many
18+
days are in a week?\"},{\"role\":\"assistant\",\"content\":\"There are seven
19+
days in a week\"}]}\n{\"messages\":[{\"role\":\"user\",\"content\":\"What color
20+
is the sky on a clear day?\"},{\"role\":\"assistant\",\"content\":\"The sky
21+
is blue on a clear day\"}]}\n{\"messages\":[{\"role\":\"user\",\"content\":\"What
22+
is the square root of 16?\"},{\"role\":\"assistant\",\"content\":\"The square
23+
root of 16 is 4\"}]}\r\n------formdata-undici-019869426906--"
24+
headers:
25+
? !!python/object/apply:multidict._multidict.istr
26+
- Accept
27+
: - application/json
28+
? !!python/object/apply:multidict._multidict.istr
29+
- Accept-Encoding
30+
: - gzip, deflate
31+
? !!python/object/apply:multidict._multidict.istr
32+
- Accept-Language
33+
: - '*'
34+
? !!python/object/apply:multidict._multidict.istr
35+
- Connection
36+
: - keep-alive
37+
Content-Length:
38+
- '1672'
39+
? !!python/object/apply:multidict._multidict.istr
40+
- Content-Type
41+
: - multipart/form-data; boundary=----formdata-undici-019869426906
42+
? !!python/object/apply:multidict._multidict.istr
43+
- User-Agent
44+
: - OpenAI/JS 5.7.0
45+
? !!python/object/apply:multidict._multidict.istr
46+
- X-Stainless-Arch
47+
: - arm64
48+
? !!python/object/apply:multidict._multidict.istr
49+
- X-Stainless-Lang
50+
: - js
51+
? !!python/object/apply:multidict._multidict.istr
52+
- X-Stainless-OS
53+
: - MacOS
54+
? !!python/object/apply:multidict._multidict.istr
55+
- X-Stainless-Package-Version
56+
: - 5.7.0
57+
? !!python/object/apply:multidict._multidict.istr
58+
- X-Stainless-Retry-Count
59+
: - '0'
60+
? !!python/object/apply:multidict._multidict.istr
61+
- X-Stainless-Runtime
62+
: - node
63+
? !!python/object/apply:multidict._multidict.istr
64+
- X-Stainless-Runtime-Version
65+
: - v22.17.0
66+
? !!python/object/apply:multidict._multidict.istr
67+
- sec-fetch-mode
68+
: - cors
69+
method: POST
70+
uri: https://api.openai.com/v1/files
71+
response:
72+
body:
73+
string: "{\n \"object\": \"file\",\n \"id\": \"file-KosHDNPNvSvvV5Xq1in5RK\",\n
74+
\ \"purpose\": \"fine-tune\",\n \"filename\": \"fine-tune.jsonl\",\n \"bytes\":
75+
1386,\n \"created_at\": 1750902244,\n \"expires_at\": null,\n \"status\":
76+
\"processed\",\n \"status_details\": null\n}\n"
77+
headers:
78+
CF-RAY:
79+
- 955904733a914211-EWR
80+
Connection:
81+
- keep-alive
82+
Content-Encoding:
83+
- gzip
84+
Content-Type:
85+
- application/json
86+
Date:
87+
- Thu, 26 Jun 2025 01:44:04 GMT
88+
Server:
89+
- cloudflare
90+
Set-Cookie:
91+
- __cf_bm=rPZ7px8xcN.LDtylJwPG.QtAxyrSQVsHs1527kj7Y58-1750902244-1.0.1.1-qGfXxpT6DwAmxCavdOfrum7zuglO7FndapWfLd7Yyo20vuSkOapzLA5jJr2YpHLY1_sKFsQcrZ1cN1H1eNf2csjQIfmM7Xq.XiPaxHWO9GM;
92+
path=/; expires=Thu, 26-Jun-25 02:14:04 GMT; domain=.api.openai.com; HttpOnly;
93+
Secure; SameSite=None
94+
- _cfuvid=4.enAXWn7AigEStGMkWkGlOxZrTNoMoZR8a8jpPLUEw-1750902244826-0.0.1.1-604800000;
95+
path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
96+
Transfer-Encoding:
97+
- chunked
98+
X-Content-Type-Options:
99+
- nosniff
100+
access-control-allow-origin:
101+
- '*'
102+
alt-svc:
103+
- h3=":443"; ma=86400
104+
cf-cache-status:
105+
- DYNAMIC
106+
openai-organization:
107+
- datadog-staging
108+
openai-processing-ms:
109+
- '255'
110+
openai-version:
111+
- '2020-10-01'
112+
strict-transport-security:
113+
- max-age=31536000; includeSubDomains; preload
114+
x-request-id:
115+
- req_63d4f896ba2a5c317425c17f29e97ccb
116+
status:
117+
code: 200
118+
message: OK
119+
version: 1
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
interactions:
2+
- request:
3+
body: !!binary |
4+
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
34+
Tn0MWtvjpBuH7WULwOGzZ3V/f79cpgBsjoccHR+Ouxx1pbs8N15jOR6T+ijJcMmiNS+lfOYMF+iY
35+
5P7zv0/5OVRv1lpP+yFakvwjyWFLi/onhd9rb7zhry0AAAAASUVORK5CYIINCi0tLS0tLWZvcm1k
36+
YXRhLXVuZGljaS0wMzU1NTk2NTMxNzMNCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsg
37+
bmFtZT0icHJvbXB0Ig0KDQpDaGFuZ2UgYWxsIHJlZCB0byBibHVlDQotLS0tLS1mb3JtZGF0YS11
38+
bmRpY2ktMDM1NTU5NjUzMTczDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9
39+
Im4iDQoNCjENCi0tLS0tLWZvcm1kYXRhLXVuZGljaS0wMzU1NTk2NTMxNzMNCkNvbnRlbnQtRGlz
40+
cG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0ic2l6ZSINCg0KMjU2eDI1Ng0KLS0tLS0tZm9ybWRh
41+
dGEtdW5kaWNpLTAzNTU1OTY1MzE3Mw0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBu
42+
YW1lPSJyZXNwb25zZV9mb3JtYXQiDQoNCnVybA0KLS0tLS0tZm9ybWRhdGEtdW5kaWNpLTAzNTU1
43+
OTY1MzE3My0t
44+
headers:
45+
? !!python/object/apply:multidict._multidict.istr
46+
- Accept
47+
: - application/json
48+
? !!python/object/apply:multidict._multidict.istr
49+
- Accept-Encoding
50+
: - gzip, deflate
51+
? !!python/object/apply:multidict._multidict.istr
52+
- Accept-Language
53+
: - '*'
54+
? !!python/object/apply:multidict._multidict.istr
55+
- Connection
56+
: - keep-alive
57+
Content-Length:
58+
- '2232'
59+
? !!python/object/apply:multidict._multidict.istr
60+
- Content-Type
61+
: - multipart/form-data; boundary=----formdata-undici-035559653173
62+
? !!python/object/apply:multidict._multidict.istr
63+
- User-Agent
64+
: - OpenAI/JS 5.7.0
65+
? !!python/object/apply:multidict._multidict.istr
66+
- X-Stainless-Arch
67+
: - arm64
68+
? !!python/object/apply:multidict._multidict.istr
69+
- X-Stainless-Lang
70+
: - js
71+
? !!python/object/apply:multidict._multidict.istr
72+
- X-Stainless-OS
73+
: - MacOS
74+
? !!python/object/apply:multidict._multidict.istr
75+
- X-Stainless-Package-Version
76+
: - 5.7.0
77+
? !!python/object/apply:multidict._multidict.istr
78+
- X-Stainless-Retry-Count
79+
: - '0'
80+
? !!python/object/apply:multidict._multidict.istr
81+
- X-Stainless-Runtime
82+
: - node
83+
? !!python/object/apply:multidict._multidict.istr
84+
- X-Stainless-Runtime-Version
85+
: - v22.17.0
86+
? !!python/object/apply:multidict._multidict.istr
87+
- sec-fetch-mode
88+
: - cors
89+
method: POST
90+
uri: https://api.openai.com/v1/images/edits
91+
response:
92+
body:
93+
string: "{\n \"created\": 1750902298,\n \"data\": [\n {\n \"url\":
94+
\"https://oaidalleapiprodscus.blob.core.windows.net/private/org-GKgUkEpTs8iJbqUCqnL6JW5H/user-DoUONI1dg5wtyS7luFo7MncN/img-byvIq6kNZ7NsTR8KR4z6zpca.png?st=2025-06-26T00%3A44%3A58Z&se=2025-06-26T02%3A44%3A58Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=cc612491-d948-4d2e-9821-2683df3719f5&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2025-06-25T23%3A07%3A31Z&ske=2025-06-26T23%3A07%3A31Z&sks=b&skv=2024-08-04&sig=IfUcT3k9T6o/QowUNxTXoykO/KJPfuiilllv%2BmcSjI8%3D\"\n
95+
\ }\n ]\n}"
96+
headers:
97+
CF-RAY:
98+
- 9559057a7fcd32ca-EWR
99+
Connection:
100+
- keep-alive
101+
Content-Encoding:
102+
- gzip
103+
Content-Type:
104+
- application/json
105+
Date:
106+
- Thu, 26 Jun 2025 01:44:58 GMT
107+
Server:
108+
- cloudflare
109+
Set-Cookie:
110+
- __cf_bm=QB1sI7n9aFjP_jZmNcRWM6aZ7M2.jyQl5u.Fr.s2o_4-1750902298-1.0.1.1-HBUg6nqJyH1jg95QSZY3JkWYGPpdWmwLgd85JrWmv26sgg7F2Avg2RZinY0IwwdHAAoCjxNA7h_BrmIaWEoqjhedz1.MpkGWSJ_dNjY4Zh8;
111+
path=/; expires=Thu, 26-Jun-25 02:14:58 GMT; domain=.api.openai.com; HttpOnly;
112+
Secure; SameSite=None
113+
- _cfuvid=uffBWhv_poEwEDxJS9actdEq5AWcfgq4884zfCnBMW8-1750902298926-0.0.1.1-604800000;
114+
path=/; domain=.api.openai.com; HttpOnly; Secure; SameSite=None
115+
Transfer-Encoding:
116+
- chunked
117+
X-Content-Type-Options:
118+
- nosniff
119+
alt-svc:
120+
- h3=":443"; ma=86400
121+
cf-cache-status:
122+
- DYNAMIC
123+
openai-organization:
124+
- datadog-staging
125+
openai-processing-ms:
126+
- '12097'
127+
openai-version:
128+
- '2020-10-01'
129+
strict-transport-security:
130+
- max-age=31536000; includeSubDomains; preload
131+
x-request-id:
132+
- req_b2201c1f70661d538e036a744dda1229
133+
status:
134+
code: 200
135+
message: OK
136+
version: 1

0 commit comments

Comments
 (0)