diff --git a/tests/cassettes/test_claude_3/test_prompt_with_prefill_and_stop_sequences.yaml b/tests/cassettes/test_claude_3/test_prompt_with_prefill_and_stop_sequences.yaml new file mode 100644 index 0000000..778a5d0 --- /dev/null +++ b/tests/cassettes/test_claude_3/test_prompt_with_prefill_and_stop_sequences.yaml @@ -0,0 +1,454 @@ +interactions: +- request: + body: '{"max_tokens":8192,"messages":[{"role":"user","content":"Python function + describing a pelican"},{"role":"assistant","content":"```python"}],"model":"claude-3-5-haiku-latest","stop_sequences":["```"],"temperature":1.0,"stream":true}' + headers: + accept: + - application/json + accept-encoding: + - gzip, deflate + anthropic-version: + - '2023-06-01' + connection: + - keep-alive + content-length: + - '231' + content-type: + - application/json + host: + - api.anthropic.com + user-agent: + - Anthropic/Python 0.41.0 + x-stainless-arch: + - arm64 + x-stainless-async: + - 'false' + x-stainless-lang: + - python + x-stainless-os: + - MacOS + x-stainless-package-version: + - 0.41.0 + x-stainless-retry-count: + - '0' + x-stainless-runtime: + - CPython + x-stainless-runtime-version: + - 3.12.0 + x-stainless-stream-helper: + - messages + method: POST + uri: https://api.anthropic.com/v1/messages + response: + body: + string: 'event: message_start + + data: {"type":"message_start","message":{"id":"msg_01Hc6vd1tdGFuu8g31Dtwocw","type":"message","role":"assistant","model":"claude-3-5-haiku-20241022","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":15,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":3}} } + + + event: content_block_start + + data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""} } + + + event: ping + + data: {"type": "ping"} + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\ndef + describe"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"_pelican():\n \"\"\"\n A"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + function describing the characteristics of a pelican."} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\n \n Returns:\n "} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"A + dictionary with various details about pel"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"icans.\n \"\"\"\n pel"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"ican_details + = {"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\n \"species\": + \"Pelec"}} + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"anus\",\n \"habitat\": + \"Coastal"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + areas, lakes, and rivers\","}} + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\n \"physical_characteristics\": + {"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\n \"size\": + {"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\n \"length\": + \"1.2"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + - 1.8 "} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"meters\",\n \"wingspan\":"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + \"2 - 3."} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"5 + meters\""}} + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\n },\n \""} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"weight\": + \"4 - 15"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + kg\",\n \"distinctive"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"_features\": + [\n \"Large"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + throat pouch\",\n \"Long"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + beak\",\n \""} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"White + or gray plumage\""} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\n ]\n },\n \"diet"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\": + [\n \"Fish\","} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\n \"Smaller + water"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + birds\",\n \""} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Crustaceans\",\n \"Amp"}} + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"hibians\"\n ],\n \"behavior"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\": + {\n \"hunting_style"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\": + \"Diving and sco"}} + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"oping + fish with throat pouch\",\n \""}} + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"social_nature\": + \"Often foun"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"d + in large groups\",\n \"breeding\":"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + \"Colonial nesters\"\n },"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\n \"interesting"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"_facts\": + ["} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\n \"Can + hold up to 3"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + gallons of water in their"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + pouch\",\n \""} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Excellent + fish"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"ers\",\n \"Foun"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"d + on every continent except Antarctica\""} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\n ]\n }"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"\n \n return + pelican_"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"details\n\n#"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + Example usage\npel"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"ican_info"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + = describe_pelican"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"()\nprint(\""} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Pelican"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + Habitat:\", pelican_info"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"[\"habitat\"])\nprint"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"(\"Distinctive"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" + Features:\", pelican_"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"info[\"physical_characteristics\"][\"distinctive_"} } + + + event: content_block_delta + + data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"features\"])\n"} } + + + event: content_block_stop + + data: {"type":"content_block_stop","index":0 } + + + event: message_delta + + data: {"type":"message_delta","delta":{"stop_reason":"stop_sequence","stop_sequence":"```"},"usage":{"output_tokens":386} } + + + event: message_stop + + data: {"type":"message_stop"} + + + ' + headers: + CF-Cache-Status: + - DYNAMIC + CF-RAY: + - 90a5a4742d35f7a5-LAX + Cache-Control: + - no-cache + Connection: + - keep-alive + Content-Type: + - text/event-stream; charset=utf-8 + Date: + - Fri, 31 Jan 2025 00:39:03 GMT + Server: + - cloudflare + Transfer-Encoding: + - chunked + X-Robots-Tag: + - none + anthropic-ratelimit-input-tokens-limit: + - '400000' + anthropic-ratelimit-input-tokens-remaining: + - '400000' + anthropic-ratelimit-input-tokens-reset: + - '2025-01-31T00:39:03Z' + anthropic-ratelimit-output-tokens-limit: + - '80000' + anthropic-ratelimit-output-tokens-remaining: + - '76000' + anthropic-ratelimit-output-tokens-reset: + - '2025-01-31T00:39:06Z' + anthropic-ratelimit-requests-limit: + - '4000' + anthropic-ratelimit-requests-remaining: + - '3999' + anthropic-ratelimit-requests-reset: + - '2025-01-31T00:39:03Z' + anthropic-ratelimit-tokens-limit: + - '480000' + anthropic-ratelimit-tokens-remaining: + - '476000' + anthropic-ratelimit-tokens-reset: + - '2025-01-31T00:39:03Z' + request-id: + - req_014Jc1PrkzF3jzDiWV8f4d1e + via: + - 1.1 google + status: + code: 200 + message: OK +version: 1 diff --git a/tests/test_claude_3.py b/tests/test_claude_3.py index 258a006..fdf213c 100644 --- a/tests/test_claude_3.py +++ b/tests/test_claude_3.py @@ -94,3 +94,32 @@ def test_image_prompt(): assert response.input_tokens == 76 assert response.output_tokens == 75 assert response.token_details is None + + +@pytest.mark.vcr +def test_prompt_with_prefill_and_stop_sequences(): + model = llm.get_model("claude-3.5-haiku") + model.key = model.key or ANTHROPIC_API_KEY + response = model.prompt( + "Very short function describing a pelican", + prefill="```python", + stop_sequences=["```"], + hide_prefill=True, + ) + text = response.text() + assert text.startswith( + "\ndef describe_pelican():\n" + ' """\n' + " A function describing the characteristics of a pelican.\n" + " \n" + " Returns:\n" + " A dictionary with various details about pelicans.\n" + ' """\n' + " pelican_details = {\n" + ' "species": "Pelecanus",\n' + ' "habitat": "Coastal areas, lakes, and rivers",\n' + ) + assert text.endswith( + 'print("Distinctive Features:", ' + 'pelican_info["physical_characteristics"]["distinctive_features"])\n' + )