Skip to content

Commit e502749

Browse files
committed
test(recorded): make KB replay cache-independent
1 parent afbdcc9 commit e502749

2 files changed

Lines changed: 67 additions & 2 deletions

File tree

tests/recorded/rails/public_api/cassettes/test_kb/test_openai_kb_generate_async_retrieves_and_injects_chunks.yaml

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,3 +433,63 @@ interactions:
433433
rejected_prediction_tokens: 0
434434
service_tier: default
435435
system_fingerprint: null
436+
- request:
437+
method: POST
438+
uri: https://api.openai.com/v1/embeddings
439+
headers:
440+
Host:
441+
- api.openai.com
442+
Accept-Encoding:
443+
- gzip, deflate, zstd
444+
Connection:
445+
- keep-alive
446+
Accept:
447+
- application/json
448+
Content-Type:
449+
- application/json
450+
User-Agent:
451+
- OpenAI/Python 2.24.0
452+
parsed_body:
453+
input:
454+
- |-
455+
# NeMo Guardrails Knowledge Base - Overview
456+
457+
NeMo Guardrails is an open-source toolkit for adding programmable guardrails to
458+
LLM-based conversational applications. The unique retrieval marker phrase for this
459+
document is "guardrails-kb-marker-7f3a".
460+
461+
Guardrails (or "rails" for short) control the output of a large language model, such
462+
as keeping the bot on topic, following a predefined dialog path, or refusing unsafe
463+
requests.
464+
model: text-embedding-3-small
465+
encoding_format: base64
466+
response:
467+
status:
468+
code: 200
469+
message: OK
470+
headers:
471+
Content-Type:
472+
- application/json
473+
Transfer-Encoding:
474+
- chunked
475+
Connection:
476+
- keep-alive
477+
Server:
478+
- cloudflare
479+
Strict-Transport-Security:
480+
- max-age=31536000; includeSubDomains; preload
481+
Access-Control-Expose-Headers:
482+
- CF-Ray
483+
alt-svc:
484+
- h3=":443"; ma=86400
485+
body:
486+
parsed_body:
487+
object: list
488+
data:
489+
- object: embedding
490+
embedding: AGB6vADgdj0AgAM9AMDNOgDAl7wAwNu6ACBTvQCgSz0AQAq9AODjPABgv7sAwDy9ACAeugBgKrwAgPY7AMDdvADggbwAIIs7AOD+OwBAlj0AwKs8AEAkPQDgoTsA4L+7AKC5OwBgQDsAIFI8AEB4PAAggrwAAIG7AGAnPQDg97wAgHa9AED4OwBg5zsA4MC8AMC9OwDAzToA4Ly7AMBYPQAgyrwAIFu9AADZvACAtTwAgC84AMDxPAAALjwAAEK8AOCOOwAAMz0AQBm9AEBkvACAvrwAID89AACBuwDAkbsAgDu8AID/uwAAjDwAIG28AGDavACAWL0AoMC8AMDXPAAASbwAQI+8AMDNvQDgpbwAQJC7AIA7uwCgaj0AIA29AGD+vACAnrwAwKq8AOBqvAAAxzsA4Dg9ACDjvACgkb0A4D89AAAqPABA7LsAoH69AGA6vAAAjrkAIGi8AODXuwCgcLwAwAi9AODBvADAOLwA4Iq8AACWPQBA2ToAoJ68ACAXuQDA0LsAwAY9AGDZOwCArDwAoHm9AIA1vQAAML0AQI89AIARvQAgFjwAQKI8AOCmvQAg87sAYFG9AIA8vQDgXz0AQKo8AKCHPQDAQToAwI68AKC2uwCAKz0AoJE4ACB3vQDgXrsAABa8AOB7vQAgazwAYPA6AGDlPADg5zwAoJS8AIC7ugBgMTwAgAW9AEBLPQAgdbwA4Cm9AGCMuwBA3bwAIF69AOA1vACAPD0AYO08AKDTuQDgwbwAQAm8AECfvQDABrwAoMS8AOC8OgAggb0AwKE8AGDtOgBgcrwA4GK9ACBRPACA0bwAQOq8AKBXvQDgfjsAYFu8AGCjOwDgNrwAIIo9AAAYPACAuzwAIEq8AEDXOwBAG70AoJA8ACALvQAg0jwAgBg8AOCjPADgI70AwJs7AGCEvADg8rwAII28AAAPvQAA6LwAIK48AEDOvACAe7wAYCy9AOAwPQBgcL0AAIC8AMCaOwAgqTsAQD28ACAjvACgJr0AwDs9ACBGPQCAAD0AwCY9AGA4vQAg7jwAoAy9AOCcPQDgFL0AoBC9ACD3PACAkT0AIFa9AMAsPACAyjwA4JW8AODcvADA/7wAAIi8AMCWPADAGz0AQEQ7AEBPugBAALwAgJo8AOBBvQBgXz0AQC+9AOBMPQBADTsAAGY7AGDAPAAACzwAIDs8AOBcPACAOz0AwE+8AIAAPQDgszsAAJU6AODSOwBAoLwAILO8ACAGPABg5bwAwL68AODtvACAVj0AoJ27AMCqPAAA1zoAgIo7ACAjPABgiDsAgDE8AIAtvACgYrwAAEg9AEAaPQDghbsA4BU9AKCAPQAgC70AoA69AKD8PABgrbwAoIG7AOAFvQCgnbwA4A09AAB5vAAAQbwA4G88AAD5OQAg47kAYAm9AMBMvABgBr0AIKE8AICFPAAgc7wAID+8AIDmuADgQr0A4Im8AOBtPAAAyLwAAAM9ACBUvABAnbwAYLy7AOC2PACgszsAgIk8AEDnOwDg+TwA4Lc8AOCzPACABrsAIIa8ACBMOwAgkzwAIDk7AOANPACAobwAgFM9AEDOvABABjwA4By8AECJvAAAJz0AwKm8AMB1vAAAwrwAAHi7AMA1PABgT70AgAS8AGCbvADA+LwAAJy8AMAbvQAgcLwAQF69AIAdvQDghj0A4IE8AOCKPQAAZbwAoI88AGDHvAAgNT0AwEm9AIBFvAAgQToAwNA6AGBvvACg7TwAgJ27AADoPADgMb0AgOc7AGAnPADAOzwAYAu9AOCQvABAAD0AIFI8AKDyuwBgnbwAgDa9ACBJvQBg8rsAACk8AMAzvAAARr0A4I67AKBGPQDgCz0AwB69ACCUvABAYrsAILW8AIAlPQAgC7sAgIS7AMBUvQBAtDwAYNg8AKBJvQCgFTwAoCG9AICSOwBgFLsAADc7AMAPvQAAfbwAgAo7AOACOwBgYrsAQFi9AEAUvQCglbwA4Fy9AACJPACgELsA4KW8AEBSPACAgLwA4AG7AAAZvQBgRrwAQJo5AIAQPQDAhjsA4BE8AGCPvACACjoAAKo7AKAHvQBg3zsAwAe9AECruwCgJ7oAYEE9AKAhPQDgfDwAgC89AECEPADAiDwAQCW8AID7vABA+DwAAO87ACBcvQBguzwAoM88AIBuvAAgnLwAgKU8AEDcPAAgljwA4GS6ACAJPQAA6LsAIAk9AAB5PABgu7sAQNE8AGDtPAAAgb0AoEe9ACDAvABgjTsAAF49AKDEPACADb0A4GY8AACCvQAAxTwAgJI8ACAOPQBghrwAIA89AGBjuwBgGT0AQC89AGAzvADAF7wAwDc8AIC1vABgmrwAAH08AKAbvQAgNz0AoIy9AABDvAAgCDwAQEq9AICIvACAgTwA4CA9AICdNwAAar0AgN+8AKCAPQBg97oAwDk8AAAnuwAgJD0AoCk9AOBBvADAlTsAwIu6AIDFvAAgRb0AwJi8AGCgPADAZr0A4My8AGBEvADAZbwAgIS8AIC7vACgDzwAQFW8AABUvQDAFj0AYAi9AKBPvACAKj0AwOc7AACyuwDAxjwAIPc9AGCnvABAKT0AgIe7AIBauwAghDsAwEG6AOAdPQAAibwA4La8ACDOuwCgmDwA4GC9AICEPACArLsAwBi9AOCEvADAO7wAYOE8AOCBPABAg7wA4O+7AAAxPQBg6zwAILM8AMDDvADAeLwAwIu8AIA1vACAGD0A4B86AAAMvAAgpbwAgEm7ACDzuQAAQbwAIOQ7AMDKPADANzoAgNI8AOBjvAAgRbsAoJu8AMBzPABgBjwAgHg8AIAOvQAgUD0AQOw7ACA0vQCABb0AQOa7AECcugBAwbwAIEO9AAC3OwAgh7wAAOY8AKDAvABgrLwAALc8AMA5PADgg7wAACg8AIAqPQAgz7sAwMu8AIAFPQDAJrwAQLm6AEDmuwCgG7wAIOI6AKAAPQCAdjsAwFW8AACUuwDg1TsAQCm8ACDOvACAmrwAIGO8AEAPPQCAersAwAK9AOCIuwCgMLsAQCu8ACDFOwCgxzwAYDe9AIAuuwBgYjwAQHM8AMC8vADAAbwAwCu9AECbPADAFL0AIES9ACDWOwDgsDwAQJ68AGCzvACgDD0AYI08AACPvADACrsAoBg9AMDIvABA2DsAIDo8AGDTvACgObsAQJI8AAArPQCAJ70AIG68AEA9PAAAEz0AQLO8AAAYOwCAurwAYBc8AKCCPACgNrwAwFw7AIChvAAAFL0AgFu9ACANvAAAajwAYCa8AMDgPABgrLwAwBa8AMDdPABgEbsAQEa9AOAlvADAsTwAAB09AKCevAAggr0AAGe9AMDsOwDA87wAIH48AGA5vQAAQbwAIB49AOBXPACgr7wAwNg8ACDEvABAlzwAwK47AKAHOwDAhzwAQMI8AKC5vADAvbwAQOY8AOCGPAAA5DwAgC+9AOCcvABAJLwAQPG8AECVOgDAw7wAoIW8AOAmPQCgGLwAoO08AOB3vQCAeDwA4JQ8AEBoOAAAG70AAA09AGAAPAAAHjwA4Ow8AECqvABgkLwAoCW8AABbvABAoTsAQIA8AGCSvACgFjsAYHC8AGCyvAAg0TsAgJO8AIDQPABgmrwAwCW9ACDkOwCgsLwA4M08AKCkPACgaz0AAHY7AADcPABgCr0AwHq8AEAgvAAARDwAQIQ8AOCnOwAgujwAQLE8AIC6vADAkrwAYIq8AKCivADgvbwAgKU7AAAmvQAgujwAwPG6AEBLPQBADLwAQAO9ACAfvQBAkjsAwGO8AKC/uQCgijsAwMK7AEC2vABAJD0AQKI7AMAUvQBgIT0AIIC9AOBAvQCgqbwAwA89ACCOOwCgUD0AYMS8AIDfvAAgPzwA4Go8AMDPOwCAHjsAQBU7ACCFPABgTLwAIJG8AGAGvQAgh70AIEy7ACB6vABAvbsAYKK7AGBrPQBAbjwAoCa8AMA7PABgDTwAYPw8AMDbvABgTjwAoBi9AIAPPQDgsjoAgBq8AEApPACA87sAoIk6AEAhPQCAaTsAwIk8ACB+PABAozwAQKo8AICtuwAgdzwAQOw8AEAZOgDgGD0AQIw8ACDpvAAAA70AgGq7AOBhPAAABD0AoLu8AGC1PAAgDjwAwPY8AIAHvQAg6DsAgL48AOBHvQAAnroAwNu6AGAHvQAAvbsAoBu8AOAMvQDAR70A4HK6AGAHvQAARr0A4F08AEA0PQAgdbwAIJ+9AMD2uwCgorsAgJc8AMBfPAAgkjwAIIM8AADvvACg1jwA4O+8AABQuwDAPzwAIGi8AMBBPABgDTwAIEO9AGCyPAAgyjsAQAQ9AICFuwAAhrwAICe9AOAhvQBgWDwA4D68AGAvPABAmDsAYH88AKAWPABgBT0AgOU6AGAtvACgwTsAYJM8AMANvQCAA70AoOA7ACDwvADgZ7wAgCU7AAD2PAAgabwAYPQ8AEDSvABAAL0AoK88ACAZuwBAwzsAQAu8AEALvACgybwAIDC8AMCVvADgOLwAwEo8AACCvABAezwAQJI8AGCVPABg3TwAgMk7AKBQvABAITwAQJe7AEChuwBA8bwAQGE9AMDNvADgo7wAYB+8AMAavACAobwAYAW9AEBnPABAOjwAwDg8AICPPAAg1DwAwAw9AAAbvADg/rsAoLa8AAA4vQBAVDsAQDo8AGAgOwBgYD0AgLi7AEDeuwDAATwAQLU8ACCiuwBghbsAoFE7AMDPvACgCLwAwMI6AODEPAAgqjwAYPe7AOBgPAAg9bsAAFa9AMAXPADgDrwA4BA9AIDYvACAQTwAIHO8AAC7uwCAEj0AAKI8AECgvABANL0A4Ki8AKDZPADgcT0AQAo8AMCgvABAxzwAoDM8AAAIvABA5rwAYAo9AECnvAAgWbwAwJ08AKAMvABAED0AoKO8AMBWvAAAXLwAwAK9AOCtOwDAX7sAAAI8AKAGPABAGz0AYIW9AMAPPQDATLwAQLQ8AICTPABADz0A4JS8AKA0vACAtbwAQP07AEBQuwBgQjwAYCo9AIAzvACgr7sAoNc7AMCbvAAAET0AYGg8AMBdvQBALrsAQE48AABdvQCgQDwAIBq9AGA9OgBgI70AoNc7ACCNvAAgCbwAIMM8AKDvPADALbwAYA69AGAAPQAAvDwA4Nc8AIA3PQAAyDwAwLm7ACCqPAAghTwAoMK7AMACPQDgWLwAoCI9AOAyPQDgjbsAoJs8AAA/vQCg1rwAQME8AEBMuwCgoDwAwEK8AGCiPABgObwAADi9AGDDvACgLDwAAB+8ACAmOQBAubwAgJg8AKCQOwAAuLsAQBc9ACAAPQCgkjoAYKK8AGBCvACALD0AwKO8AGAyvAAgf70AYBS9ACAkPABgcDwAgMS7AODOPAAgEz0AYKk8AMCYPACAtboAwIs7ACDouwDgID0AgJU8AIAAvQDATDwAQCS6AIBuPAAgnrwAQOm5AEAuvAAACTwAIKI8AECovACAcbsAQOm8AODtPADgBD0AIPy7AECbugDg1bwAYBU8AOB7OwDgajwAgFg8AIDzPABgbbwAoEC8AICqPADAeDsAQE08AADxvABg4DwAgII8AGCJPABAnjwAgFg8ACCHPAAgRzwAABY7AECkOwAA1LwAAFO7AIA/PACg3DsA4B89AODXOwDgtjsAoLs7AEARPQDAJ70AII48AIA3vQAgEzsAgFo8AIAkPACAljwAwKq8AGCquwCgSTwAANm7ACABPABAmbwAABE9ACCHPAAgxjwAoK08AOCPuQCgjjwA4CE9AMC+uwBg9LwAALO6AEAPvQBACL0A4B09AIADPQDgfDwAACE9AIAKPAAAXrwA4Nq8AIACOwAAT7wAICA9AOCgvABA1LsAAEk8AKB+PADg5zwAQH08AGCruQAAW7wAIGe8AGD5vABAHjgA4IM8AKB3uwDgNrwAIBk9AIDSvADgHLoAYHA8AOA5ugBAqLwAILu8AKDUugDgI7oAAIi8AEDpPAAAfrwAIAI7AGC9uwBASrsAgBW9AOCOvACACjwAgJM8AAC8vADAfTsAALQ4AMCfuwBgirsAgEu8AABMPADA2zsAgHE9AECVvADAgj0AIMY8AMASvQCAwzwAYFW8AKCIPABgtzwAwKa7AACXvADAojwAIDu8AKCVuwBgObwAgBW9AAAfvACAUrwAQKq8AIBVOwDAYbwAgEU8AIAVPQAASToA4D88AMBNvAAAC7sAIMS8AOC0vACgILwA4C49ACAzPQDgzrsAgLK8AED0vACgazwAYMa8AECZugCg2jwAoBq8AGDGPACA+LwAwFw8AGDkvABgiTwA4PK7AMA0OwCg0LsAoJc7AICDvAAgzrsA4PK7AGACPQAAebsAYPm7AICnOwDAD7sAwDo7AECnPACAuTwAAKM8ACANuwCgjrwAoCE9AMC0OwDgjDsAQNy7AACjvACgmTwAgFm6AAC6PADADzwAIO27AKDqOwDAbjwAYIU8AKDgPABABD0AYCg9AKA5vAAA/jwAYPC8AGB6vADAQLwAAIw7AEBhvAAgDT0AQN47AAAEvAAAy7wAIM46AACYPACAoTwAAEA8AKASvAAgYj0AoDi8AICSPAAg6bwAwOk7ACAfPAAAtjwAYIq5AECYuwBgP70AAJ88AAAFOgAg3TwAYMG8AOBouwCgFLwAgKI8AMAXvQDA8LwAoJ67AMB7vABgEbwAQLK8ACCSPABg/jwAoDC9ACC2vADgrjwAICE7AAA3uwBg7zsAwOy8AIA3PADAxzwAIMW8ACALPQCAjroA4MQ7AMAdPQBgw7sAQBO8ACDeuwAAmbwAoPI8AMCFuwDAZrwAgIW7AEA4vADgozwAYC28AIA1uwAAIjwAIBM9AEAkPADgODwAYNg7AMC8vADA7LwAYNg5AKB3vAAApzwAYMk7AGC6vAAAADwAgNK7AIB9uwBAgLwAoNy7AKDNuwAADr0AYGC7AKByPQDgEr0A4Kk8AOCcOwDg0jwAQKs8AABDOgDA/ToAQKK8AICzOwCg5TwAwDK9AMDGuwCAq7sAACU9AIAGvAAg2LoAgNo8AACTuwDAe70AQB28AGBEvAAgc7wA4FC8AAC/OwAg8zwAQAM8AKCMuwDAW7wAIK68ACANvQAgfjwA4CQ8AKAIPAAgkzwAoEA9AOBiPABAJbwAICY8AOABPQAg3DsAICo8AMAfvQBgzjwAoCy8AKAavQDgcbwAAHu7AOC+PADgbDwA4NI8ACCuPADgubwAgE48AGDRuwAgEbwAgJO8AOAmvQAgZDwA4Ay9AMDDvABAWTwAgH08AOCNvACA47wAwE+8AIAaPQBA3bwAIGO8AEDpPAAAhrwA4Ce8AKDauwDAqLoAADC8ACAPPABgQDsAwDA9AMBuvABgzrwAIJC8AADsPACgYjsAQA48AOCQuwAgFj0A4C68AGAYvAAgmjwAwNS8AOBEOwAA57wAwCs8AMCEPACASTwAoAG9AODAvACgH70A4GU8AEBBOwDARrwA4J07AADvugCgATwAIAc9AAD+PABgL7wAoBi8AMD6uwBAiTwAAAq8AGAuPADAlzsAoAM9AABgPADAHjwAYNw8ACCfvADAkrwAYLy8AGDaPADAtjwAgB68AGC0vABAk7wAgPa7AKBFvADggTwAIIm8AEB7vACAiDwAANm7AOC3uwCA/bwAQEc5ACBJPQAAkrwAwJE8ACCzPACgs7wAALY8AKDlPAAAqjsAABM8AAD+uwDA8bwAoIM8AKAQPQBgHToAYM68AMAAPQDABrwAAKI8AMBnPADgUb0AwDc8AABGvAAADbsAAC48AIBiugAASj0AALS7AGDbvABAhLwA4Bs9AKCPuwDgsbsAAKi5AIAtPABgAz0AgK28AIAgPQCg77kAoAg8AOAfPQDgGroAQP28AOAdugAAGr0AwGA7AKDOPADA4zsAYP68AGD6vAAA9jwAQNm6ACCluwAgrLwAQNe8AGAFvAAAjjwAgCU9AGBevADA7rwAoA28AOAmvQAAS7wAYGc6AKCBugDACDsA4As8AOAzPADgGzwAgF28AADsOwDAeDwAwNa8AIBlPACgIDwAQNS8AMCGPACA7DwAgMS6AACnvABgkbwAQEq9ACBLPQAABrsA4Pc8AICBvABAqLwA4L28AAA/PAAAoDwAoBu9
491+
index: 0
492+
model: text-embedding-3-small
493+
usage:
494+
prompt_tokens: 96
495+
total_tokens: 96

tests/recorded/rails/public_api/test_kb.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import pytest
2828

2929
from nemoguardrails import LLMRails
30+
from nemoguardrails.kb import kb as kb_module
3031
from nemoguardrails.rails.llm.options import GenerationResponse
3132
from tests.recorded.cassette import cassette_request_jsons
3233
from tests.recorded.normalization import normalize_generation_response
@@ -41,8 +42,9 @@
4142

4243

4344
async def test_openai_kb_generate_async_retrieves_and_injects_chunks(
44-
openai_api_key, record_mode, recorded_cassette_path
45+
openai_api_key, record_mode, recorded_cassette_path, monkeypatch, tmp_path
4546
):
47+
monkeypatch.setattr(kb_module, "CACHE_FOLDER", str(tmp_path / "kb-cache"))
4648
rails = LLMRails(load_config(OPENAI_KB_CONFIG), verbose=False)
4749

4850
result = await rails.generate_async(
@@ -65,9 +67,12 @@ async def test_openai_kb_generate_async_retrieves_and_injects_chunks(
6567
assert any(KB_MARKER in json.dumps(body) for body in chat_bodies)
6668
# B3.3: the embedding provider request-body fingerprint (model + input) is recorded too.
6769
embedding_requests = [payload for payload in bodies if "input" in payload and "messages" not in payload]
68-
assert embedding_requests, "expected a recorded embeddings request"
70+
assert len(embedding_requests) == 2
6971
assert all(payload.get("model") == "text-embedding-3-small" for payload in embedding_requests)
7072
assert all(payload.get("input") for payload in embedding_requests)
73+
embedding_inputs = [value for payload in embedding_requests for value in payload["input"]]
74+
assert any(KB_MARKER in value for value in embedding_inputs)
75+
assert "What is NeMo Guardrails?" in embedding_inputs
7176

7277
assert result.output_data == snapshot(
7378
{

0 commit comments

Comments
 (0)