Skip to content

Commit 474d54d

Browse files
committed
test(recorded): add client cassette coverage
1 parent 05def3f commit 474d54d

9 files changed

Lines changed: 242 additions & 0 deletions

File tree

tests/recorded/clients/__init__.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
16+
"""Recorded client tests."""
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
version: 1
2+
interactions:
3+
- request:
4+
method: POST
5+
uri: https://api.openai.com/v1/chat/completions
6+
headers:
7+
Host:
8+
- api.openai.com
9+
Accept:
10+
- '*/*'
11+
Accept-Encoding:
12+
- gzip, deflate, zstd
13+
Connection:
14+
- keep-alive
15+
User-Agent:
16+
- python-httpx/0.28.1
17+
Content-Type:
18+
- application/json
19+
parsed_body:
20+
model: gpt-4o-mini
21+
messages:
22+
- role: user
23+
content: Say hello in one word
24+
response:
25+
status:
26+
code: 200
27+
message: OK
28+
headers:
29+
Content-Type:
30+
- application/json
31+
Transfer-Encoding:
32+
- chunked
33+
Connection:
34+
- keep-alive
35+
Server:
36+
- cloudflare
37+
Strict-Transport-Security:
38+
- max-age=31536000; includeSubDomains; preload
39+
Access-Control-Expose-Headers:
40+
- CF-Ray
41+
alt-svc:
42+
- h3=":443"; ma=86400
43+
body:
44+
parsed_body:
45+
id: '[RECORDED_RESPONSE_ID]'
46+
object: chat.completion
47+
created: 0
48+
model: gpt-4o-mini-2024-07-18
49+
choices:
50+
- index: 0
51+
message:
52+
role: assistant
53+
content: Hello!
54+
refusal: null
55+
annotations: []
56+
logprobs: null
57+
finish_reason: stop
58+
usage:
59+
prompt_tokens: 12
60+
completion_tokens: 2
61+
total_tokens: 14
62+
prompt_tokens_details:
63+
cached_tokens: 0
64+
audio_tokens: 0
65+
completion_tokens_details:
66+
reasoning_tokens: 0
67+
audio_tokens: 0
68+
accepted_prediction_tokens: 0
69+
rejected_prediction_tokens: 0
70+
service_tier: default
71+
system_fingerprint: '[RECORDED_SYSTEM_FINGERPRINT]'
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
version: 1
2+
interactions:
3+
- request:
4+
method: POST
5+
uri: https://api.openai.com/v1/embeddings
6+
headers:
7+
Host:
8+
- api.openai.com
9+
Accept-Encoding:
10+
- gzip, deflate, zstd
11+
Connection:
12+
- keep-alive
13+
Accept:
14+
- application/json
15+
Content-Type:
16+
- application/json
17+
User-Agent:
18+
- OpenAI/Python 2.24.0
19+
parsed_body:
20+
input:
21+
- test
22+
model: text-embedding-3-small
23+
encoding_format: base64
24+
response:
25+
status:
26+
code: 200
27+
message: OK
28+
headers:
29+
Content-Type:
30+
- application/json
31+
Transfer-Encoding:
32+
- chunked
33+
Connection:
34+
- keep-alive
35+
Server:
36+
- cloudflare
37+
Strict-Transport-Security:
38+
- max-age=31536000; includeSubDomains; preload
39+
Access-Control-Expose-Headers:
40+
- CF-Ray
41+
alt-svc:
42+
- h3=":443"; ma=86400
43+
body:
44+
parsed_body:
45+
object: list
46+
data:
47+
- object: embedding
48+
embedding: AGAhvADgzDoAoIA8AKBgvQBA07sAAFS8AEAfPADAXbwA4Oo8AKAAPABAAj0AwNa7AOB+OwAgJjwAoGY8AAA3PQDgdL0AIB67AKBRvQBgFT0AIBQ9AIDHPADAIz0AoDK9AEANPQBAoLwAwGS8AAAuPACA/zwAQCq9AKBwPQCA7LwAQLa6AAAfvQAgYj0AIIg7AGDBPADgmjwAILu7AGCBuwDgKb0AIDi9AGA6PAAA3zwAwPU8AICZvADADL0AYB69AIBGPQAg5DwAIAK9AKA1uwBgRT0AwI89AGCePABgxDwAABC9AGCjPABglzwA4K47AAAZuwBAmrwAIB09AOC0OwAAA70AAHa9AMBHPADAAD0AwAE6AGCwPABgPD0AgEI8AMBRvACAiTwAQA48AMCjPACAMzsAYJU8AABvPABABLwAgKU8AIAzPACgoLwAAB48ACD/PABAUrwAYLm9AEDNOwCA4TsAYBW9AOA3vABga7sAwHo8AMBTPQDgvjwAAOG8AMAmuwBAk7wAgB87AGDuuwCAKTwAAB88AECuugDgkjwAALg8AMCYPAAAAr0AwMA8AGBNvABACD0A4L+7AOCovACgj7wAQPE8ACA3PQBgdzwA4OA9AMDTvQAgCz0AAJK9AEDgPAAg+jwAoEw8AAC7vACAAT0AYKy8AGDHuwAgG7wAoLu8AADTNwDgAb0AwKA7AGAHPQCAHTwAADG8AKAHvABAzrwAYJQ7ACBwvQBAKj0AIDk8AGDFPADg0DsAoAw6AOCEvABA57wAwIm8AAAlPQDgujwAwOY8AAA8vACAuTsAIAO8AMBuOwAgXL0AoBq9AICBvABAobwAAAC9AODmugBAxjwAAKO7AIA5PAAA0LwAING8AOAMPAAgAbwAQI+8AOBXvQBgnTwAQNo8AMB9PADgXzwAwEu8AACpvAAAxTwAgLe8AEApPAAgt7wA4AY7AICkvADgTz0AYNG8AECaPAAgeDwAAHK9AADGPABAsDsAAEQ7ACBivACAxrsAoBm8AMDuPACAHD0AQOI8AICevQBglzwAAP08AEBevADgJj0AwA+9ACBCuwCgJzwAoDu8AKB3PABAXzwA4MO8AKBAPQDgjrwAgMy8AACPPQBAsroAgPi6AGBBOwAAtLsAgPg7AGBQPQBATjwAABC8AGB6PQAgBbwA4CQ8AKCzPQBASTwAoCe8ACCrPQBgNzwAQGi8AECzOgBgZ70AADC9AOCSPACA+zsAoIm7AADDvADg1TwAIAm9AACIuwBgD70AQFO9AEAavQCgGzwAIPO8AIAgvQDAqbwAIFa8AADLPACgHbwAQNI8ACB4PADgqjsAQBm9AIAZvQAAjb0AAOA8ACAsvACA0DwA4CE7AECrPABABbwAQFG9AGBuuwAALr0AIEy9AGCHvQDAqjsA4O88ACBpvADgWjwAADa9ACDauwCAeDwAIJg8AKCrvADA/7wAICk9AOCkugDgmjwAgNQ8AEDbPADALb0AIF68ACCguwBg6bwAIDm8ACDGPABAMzwA4Du9AKDrOwBgeT0AIFK8AGAxvACgrjoA4AY9AICEPADguzwAQKY8AEAkvQDgBjoAQGq9AIABPQAg9zwA4Ks7AKDoPACAGbwAwDk9AMBhPADgArwAgG87AICIvAAgCTwAAKE8AOBQugCg9DsAwGw8AOBQvQBAWbwAgGo9AIATPQAgurwA4Ew8AEC5vACgCz0AoAQ9AOB+vABAL7sAQMg6AIDbvACAajwA4Ac9AIDDvQDg5LwA4Ge7ACANvACgED0AQAQ9AMAXPABAYz0AoL+7AAArPQAAib0AYDk8AGA5uwAgRbwAgDw9AAC5PAAAOT0AgMW8ACD8PAAgaTwAoDA9AAAuPAAAErsAALA8AACwPADAUL0AIIm8ACB1PABgBT0AgOe6AOBnPABAMD0AoDg9AAApPADgPz0AgKM8AEDavABAOrwAgG+8AAB2OgAgKjwAQA49AOA6PQDgjDwAQA69ACD6PABALz0AAI49ACC9PACgOz0AoOg8ACAePACAED0AADW8AEDnPAAAITsAQIC8AEDdPAAgabsAYKK8AGBSPQAgp7wAIIy8AKCcvQBggT0AYM08ACCbPADgoj0AIJU8ACAtuwCgtzwAQCG9AAArvQCAJT0AQEm7AMAVPAAABL0AAGO8AGAFPQBAKLsAQNe8ACAJPQCABj0AwAe7ACBOvADgubwAAPs8AAB2uwCAAj0AIDM8AIAHvQCgHL0AoD+8AEB9PABgt7wAgM06AIA4PQBAmzwAIBA9AOC8vACAFbsAIKO8AOASvQDAFz0AIAy9ACCFvADA7jsAQHg7AOCquwBgYDwAQMW8ACCouwBgeTwAILK8AKAqvQAAmDwAQA+9AAAtvQBgDTwAQKC8AKAtPACgEb0A4F28AGB1vQDggDwAoFy9AIBGPABAXLsA4IQ9AACUPADAFT0A4Dw9AKCAPADgRT0AwFA9AKDDuwAA1jwAAA49AMAuPQBAJL0A4A+8AECjvAAAPT0AwKQ7ACAQvQDAc7wAYMc8AABnuwDgOToAwKC9AEADvQDgB70AQP28AECEvADgRDwAgOo9AAAdvQDgnToAwJ+8AAB5vAAgCD0AQF86AMC+PAAgf7wAIMg7ACALPQCA4TwAwKQ8ACCFugDAADwAQJS9AKDDvADAEL0AQIk9ACDRPADApjwAYDK8AKCYvADATj0AYEi7AGCQvACgYjsAwPW5AEAauwDA/bwAQGC8ACCxvADA8TwAAAW8AEA7vAAAaLwAwKs8AODKvAAAjrwA4KS8AADCvADg97sA4NG9AABVvAAAfr0AgA69AEADvQBAlzwAoM+8AGAeuwBgm7sA4Ca8AKAyPABg8LwAoGu8AEDLugBgkjwAwIi7AABMuwAgFLwAoCY9AKBqOgCgrbwAoF68AOC3vACATDwAwC69AIAePQBAeTsAoEg9AEB7ugBgOzwAwIC8AGCQPADAD7wAAIM7AKDBOwBgnjwA4DK9AGBUvADgSzwAAJk7AGCnvAAAwzwAAGE7AOBGvACgHD0A4AG9AECgvAAAQbwAAP27AADetgBAuLwAANY7ACBbuwBgRzsAQEG8AACRvAAAsTwAILe8ACBCOwBAID0AgBu9AGAmvQBgn7wAYN48AGAUPQCguTwAYC68AMBuPQBguzsAQIg8AAAUvADg0bwAAG28AIDmOwBAr7wAIGY9AICgPACg7zsAYFY8AOD2vACAizsAYJ+8AMBFPACApjwAYDy7AGAnvABACb0AQAI8AOCAPACgoTwAQGa8AOB+PACgi7wAwI+9AKAWuwCgeTsAAIo8AAAIPABgujwAQCM8AEDPOwAg8DsAwF88AGAnvQAgLzwAwDg8AEARvQAgmrwAwES9AGDHuwBA9jwAQOq8AECLvABAFT0A4OM8ACB3PAAg6TsAgA09AMAwvAAApLsAQMe8AKAXvACg9ToAQO+8AMBHvADgqLwAYGS7AKAJPQCgKr0AoCK9AGAUvQCA3LsAQCW8AEDzPACAxjsA4Js8AID2vABggzoA4DI9ACDtvAAgkLwAYKq6AEBBvABAyLsAwPM7AMAUPQCgDb0AoCc9ACCDOQAAjrwAIDi9AEAtvQBg4DwAAEO7AEA9vADA9bwAAKm7AMCzvABgjzwAALe6AGCxOQAAXTwAAHu7ACDivAAgxDsAoAo8AOB8PAAAg7wAwDW8AABROwDgGLwAwIC8AACruwDAbjwAIGm7AGAuvABAI70A4Le8AMBwvAAAsDsAQBk8AAAkPAAgADwA4D+8AKClOABABL0AgOY8AOAnugCgcDwAQEG8AMCBvAAglDwAoKA8AEC0PABAHLsAgEM6AGAgvADgWTwA4KW8AECuvADgJjwAIOu8ACALvQCglbsAAF27ACCOOwCgZzoAQAE9AKA7vABgw7wAQIM6AMCuPABAUr0AIAg7AIAcPADgXjwAYGC8AKDyPADgrTwAIIK8ACDuOwCAITsAABG9AGA8OQBgIzwAwMG8AKCtPAAgFb0AIEK9AMB7vACA2LwAQIy7AGD8PABAjzwAAHY8ACAJPQAAkDwAIBG8AADXvAAgeLwAQA09AECoPAAgszwAgJ48AIA3vABgsTwAYHq8AKAJPABgMT0AADS9AICPPABAeDwAwKI8AMCVvABAV7wAoPC7AKDgOgDgEbwAYMU8AMA8PACgsTwAgI+8AAB0vACADLsAAIA8AGCqvACg6DwAgBk9AOALvQAgF7wAoN+8ACDKPAAgFr0AgFK8ACArvACAkzwA4KM6AGCGPACgx7wAQGE8AMAfPQBgprwAIBi9AAC7vAAA1DwAAJC7AKD1PABAILsAYLW8AGA8vADg6zoAwL47AECAvADAbjsAoAu9AODmPADgIL0A4FC8AABsvAAAaDwAgBY8AEANvAAAyzwAAJk7AICmvACgVjsA4Cu9AKCzPABg2DwAIAA8ACByvAAAibsAwJm8AODhPAAgrjwAoJy6AKCVvADA/TwAwJ46ACCAugCgujoAoNO8AMCEugAgyTwAAJK7AODvPACgCj0AIEY7ACASvADgXLsAwBe8AADtugDg37wAQBq9AIDDPACAhbwAAGe8ACAsPQDgWzwAwOW7AGCuPADAozwA4N87AACvOwAgsLwAYJy8AGDHvABg/DoAwBU8ACBTPADAVjsAYOA8AOAhPQDgID0AoAM7AABKPAAgFD0AwGQ8AOAvPQDAI70AwM08AMAgPAAgujwAwAw9AECBPACAqbwAAJa9AKCtvAAAvjsAgC89AAApvADg2jgAoMI7AGCmvADg4boAwFg9AMCYPACg9LwAAOq7AGAPvQBg1TsAYI68AADEPABgfLwAIA69AKChPADAJDwAYG48AKCsPACAl7wAgJU8AIBLPQDAbrwAQBO8AIAsvQCgojwAIJu8AICQPACgMrwAAA09AEASPABgSz0AoAq9AEDvvACg2jwAQN68AICOOwBA/TwAgFs9ACBkPACAhjsAANq6AOCMOwAgibwA4L+8AGAqvQCg9zwAwJi8AOA6PABAWDsAABo9AKDEuwAgPrwAACw8AGA/vQBg6TwAwJW8AICFvAAgU7sAIDs6AGB3vADALj0AoLI8AMCmOgDgGTsAwHM8AADsvADg3TwAQAQ9AMA0PABgrLsAQB27AIDHPAAgcrwAwFg8AGAGPQCAlDwA4Lk8ACCyvABA/TwAwH08AGCMPAAgh7sA4O87ACCUPQCAJjwAQN88AAB0PAAgJD0A4Oo8AKBYuwBA07sAIB08AIC7PABAfbwAIOe6AAAQPQAAVToAYBc8ACC6vACAg70AgA27AMCMPACgEDwAoMc6ACBzvADgIT0AQMW8AIAOuwDAl7sAwHM8ACCDuABg9DwAQAk9ACAnPADg8rwAYCy9AGC+vAAAYLwAwIy6AGAsvQBAXrwAAOy6AIBeuwCgELwAwA88AGBhPABggjwAQIM7AAB5OwAAKrwAwLI8ACDhvABgGTwAwIk8AECOPAAgHT0A4Kk7AMB4uwDgqLsAQAk8AECJvADgCDsAYK88ACAbPQAg0TwA4AU9AGAKOwAghTwAgPM8AMDgPADgMjwAoLY7ACDXuwAAYbwAANa8AKBOvACg67sAwLW7AADtPADgTjwA4EE9AIDeuwCg47oAwOy8AECYvABg97wAgBu7AOC5PABgz7wAACA8AKB1vABgGT0AAJk8AEDdvACgFz0AIPM8AODAvAAgvboAIHO8ACAtuwDgybwAoGI8AIALvADAuTsAgJ27ACAbvACgQLwAQMU8ACB6OwAgWLwAgH88AGB8PAAgCb0AIGI7AAAKvADAEr0AYKS7ACDZPADAYzwAACc9AEACPQBAaLwAQPa8AOCXuwBAAjsAwNS8AKALvQDAl7sAoHI7AAB9vABAxDsA4Js8AAASvAAgwbwAYOA8AGDuPACAv7wAwBe9AKBgPABA1rwAQMc6AIBevABgtLsAICO9AEBUPQBAs7kAQAG8AIBgPQBgirwAwFY8AKAYvQCgtDwAwNi7AMDsPABgEj0AQKq8AMBEvQBA8zoAwK87AAArvQDANj0A4C68AMDSuwBgJbwAgIo8AGDDPADgsbwAgDi8AODruwAABz4AgOk6AMBfOgAgXLsAwJc8AEAgvAAgtLsA4La8ACCRuwDAizwAgNG8AAD+OwCgEbwAwF88ACBrvAAgzzsA4Ba7AIBuvQBAxjsAYEC9ACCSvACAtzwA4LA8AECWPABAvzsAoAu9ACA4vAAAFL0A4AI9AMCsPABgDTkAYMS7AEDxvACABTwAIEa8AMAHvQAgIrwAgCE9AIDsuwCglrwAoLM7AOBUPADgDTwAIB68ACDyPABgEzwA4DI7AMDxOgDAbjwAgNw8AIC3vACAtrkAwAo6AMAKvACAZTwAoFi9AEBIPABAtrwAYA49AECsvACgmLsAIJa8AMD7PADA+DsAIGm8AMDJvABg/7sAIKu7ACBUPADgiLwAgGm5AGCJOgCAD7wAgAa9ACB8vADA/bwAgDI9AIBzPAAg8rwAIBq8AOCmPACAnDwAYAE9AOCauwAg5LsAwF87ACD1uwDABr0AYIy8AOCsvADgYTwAIC87AKCvOwBgBz0AgHM7AIAbOgBAILwAAMY7AAByvABAK70AYPo8AKC7uwBgZ7wAIDI9AMBMPABgqLwAwP28AGC1vABghzwAgCw8AOCTPACgj7sA4GU8AICzvAAAXDwAYKa7AEBBvQCgkzwAQFm8AICsvADgEbwAQJM8AEAuugDgqjwAAB+8ACC8uwAAUrwAgJA8AGBuuwBgMToAoBw8AKBIvQBAxDsA4GC8AGCVPAAggLsAQJ48AKA2vQDg9zwAoK08AIDaPAAAAzwAoLO8AKD8uwBgsTsAQB68AICsOwCAxTsAgHO7AODmvADgKL0AYDI7AABRvAAAmrsAAIg8AOCAuwAAKbwAQG+7ACAkvADAwTsAAG28AMDwugCA4jsAIDc9AAC6PABALrwAoOe7ACDYPABghTwA4Di6AECOvABgMr0AYCg7AODNuwCgwjwAwGS8AKAovABg6zsAQIA6AIAquwBAUDwAYKa7ACCpvADg+zsAgLi4AMA5PAAAhDsAQD+8AACqvADAHL0AgP88AGBTvACgVT0AIPc7AGAtvACAmDwAAAK9AEAivQCgI7wA4DG8AICsOwBAlrwA4OK7AADvPAAg4DsAwOc7ACD4vAAgRzwAQGe8AKDYOwCgWzwAIKW7AOBPvACAHzwAwLY8AAC+OwCgoDwAwKY7AAABvQCgALsAYBw8AGCGOwAg0TwAoKe8AEBvugDAVLwAoAk9AAAkvQCABDsAIDq9AMCHOwCgCT0AYIs6AAASvQAgvrwAIEY7AMB4vADggDsAQMC6AKAMPADgfrwA4Lk7AKAGvQAg7TwAwOU8AAC1uwAAQzwAYBU8AIDiOwCgFbwAYEM8AEDduwCAwrwAIPU7AKA6OwCgJrwAgBY9AGAEvQCg1rsAYKa8AKDcvABAqrsAQF47AGDROgAgQz0AAEA8AEB4PADg9zsAIOi8ACAJuwAA/rwAQMO7AGBpOwBAyjwAIHc8ACCkPACgkjwAIIk7AKCAPADgAL0AIPA7AEAJvQAgAboAoD28AEAavABggjwAIJ07AOCmPAAA8rsAYNc7AMB2vACgt7sAYNs7AECePADgRjwAoM07AECtOwDA+LwAQFa9AACFOwBgArsAoPm8AECEPACAH7wAAP27AEDivAAgGz0AgNm8ACDAOwCgDDwAwBi8AABLvABgzbsAQAS7AACGvADApLsAIIq7AMDpOwBAkLwAQA68AMAIvQDA0zwAYJm8AICwvACAlrsAYAU9AMB6vABAQ7sA4AU7AGA2uwCghbwAoIs8AADBvACgZ7sAYGg9AIAWOgDAhLwAICq8AMD4uwDA/bwAwLK8AIBCuwBAozoAAAg8AAD2OgDA8TwAwO47AIDxOgDAuDwAQK48AAAIvQAgqbwAgCg9AGAMvQDg+bwAIHO8AKASPQDAvzoAACK9AKCpOQAg3DwAgDo8AKDAPACgbbsAYEI7AAD+OwCAl7wAIAk8AKCruwAAk7oA4Gu9AMAPPQBAMDoAAAS9AAABPABgoDsAoDK8ACBcOwDgUr0AIF+8AADvuQCgwLwAABY9ACA/uwCgw7wAoMY7AGDPugAgt7wAIKO8
49+
index: 0
50+
model: text-embedding-3-small
51+
usage:
52+
prompt_tokens: 1
53+
total_tokens: 1
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
models:
2+
- type: main
3+
engine: openai
4+
model: gpt-4o-mini
5+
parameters:
6+
base_url: https://api.openai.com/v1
7+
max_retries: 0
8+
passthrough: true

tests/recorded/clients/configs/openai_chat_config/rails.co

Whitespace-only changes.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
models:
2+
- type: embeddings
3+
engine: openai
4+
model: text-embedding-3-small
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
define user ask capabilities
2+
"What can you do?"
3+
"What can you help me with?"
4+
"tell me what you can do"
5+
"tell me about you"
6+
7+
define bot inform capabilities
8+
"I am an AI assistant that helps answer questions."
9+
10+
define flow
11+
user ask capabilities
12+
bot inform capabilities
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
16+
import httpx
17+
import pytest
18+
19+
from nemoguardrails.llm.clients.openai_compatible import OpenAICompatibleClient
20+
from nemoguardrails.llm.models.openai_chat import OpenAIChatModel
21+
from tests.recorded.utils import DUMMY_OPENAI_API_KEY, api_key_for_record_mode
22+
23+
pytestmark = [pytest.mark.recorded, pytest.mark.vcr, pytest.mark.asyncio]
24+
25+
26+
async def test_openai_chat_generate_text(record_mode):
27+
api_key = api_key_for_record_mode("OPENAI_API_KEY", DUMMY_OPENAI_API_KEY, record_mode)
28+
29+
async with httpx.AsyncClient() as http_client:
30+
client = OpenAICompatibleClient(
31+
base_url="https://api.openai.com/v1",
32+
api_key=api_key,
33+
http_client=http_client,
34+
max_retries=0,
35+
)
36+
model = OpenAIChatModel(client=client, model="gpt-4o-mini")
37+
38+
result = await model.generate_async("Say hello in one word")
39+
40+
assert isinstance(result.content, str)
41+
assert result.content
42+
assert result.finish_reason in {"stop", "length", "tool_calls", "content_filter", "other"}
43+
assert result.request_id
44+
assert result.usage is not None
45+
assert result.usage.input_tokens > 0
46+
assert result.usage.output_tokens > 0
47+
assert result.usage.total_tokens >= result.usage.input_tokens + result.usage.output_tokens
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
#
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
#
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
#
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
16+
import pytest
17+
18+
from nemoguardrails.embeddings.providers.openai import OpenAIEmbeddingModel
19+
from tests.recorded.utils import DUMMY_OPENAI_API_KEY, api_key_for_record_mode
20+
21+
pytestmark = [pytest.mark.recorded, pytest.mark.vcr]
22+
23+
24+
def test_openai_embeddings_sync(record_mode):
25+
api_key = api_key_for_record_mode("OPENAI_API_KEY", DUMMY_OPENAI_API_KEY, record_mode)
26+
model = OpenAIEmbeddingModel("text-embedding-3-small", api_key=api_key, max_retries=0)
27+
28+
result = model.encode(["test"])
29+
30+
assert len(result) == 1
31+
assert len(result[0]) == 1536

0 commit comments

Comments
 (0)