|
7 | 7 | from openai.types.create_embedding_response import Usage as EmbeddingTokenUsage |
8 | 8 |
|
9 | 9 | from sentry_sdk import start_transaction |
10 | | -from sentry_sdk.integrations.openai import OpenAIIntegration |
| 10 | +from sentry_sdk.integrations.openai import ( |
| 11 | + OpenAIIntegration, |
| 12 | + _calculate_chat_completion_usage, |
| 13 | +) |
11 | 14 |
|
12 | 15 | from unittest import mock # python 3.3 and above |
13 | 16 |
|
@@ -737,3 +740,124 @@ async def test_span_origin_embeddings_async(sentry_init, capture_events): |
737 | 740 |
|
738 | 741 | assert event["contexts"]["trace"]["origin"] == "manual" |
739 | 742 | assert event["spans"][0]["origin"] == "auto.ai.openai" |
| 743 | + |
| 744 | + |
| 745 | +def test_calculate_chat_completion_usage_a(): |
| 746 | + span = mock.MagicMock() |
| 747 | + |
| 748 | + def count_tokens(msg): |
| 749 | + return len(str(msg)) |
| 750 | + |
| 751 | + response = mock.MagicMock() |
| 752 | + response.usage = mock.MagicMock() |
| 753 | + response.usage.completion_tokens = 10 |
| 754 | + response.usage.prompt_tokens = 20 |
| 755 | + response.usage.total_tokens = 30 |
| 756 | + messages = [] |
| 757 | + streaming_message_responses = [] |
| 758 | + |
| 759 | + with mock.patch( |
| 760 | + "sentry_sdk.integrations.openai.record_token_usage" |
| 761 | + ) as mock_record_token_usage: |
| 762 | + _calculate_chat_completion_usage( |
| 763 | + messages, response, span, streaming_message_responses, count_tokens |
| 764 | + ) |
| 765 | + mock_record_token_usage.assert_called_once_with(span, 20, 10, 30) |
| 766 | + |
| 767 | + |
| 768 | +def test_calculate_chat_completion_usage_b(): |
| 769 | + span = mock.MagicMock() |
| 770 | + |
| 771 | + def count_tokens(msg): |
| 772 | + return len(str(msg)) |
| 773 | + |
| 774 | + response = mock.MagicMock() |
| 775 | + response.usage = mock.MagicMock() |
| 776 | + response.usage.completion_tokens = 10 |
| 777 | + response.usage.total_tokens = 10 |
| 778 | + messages = [ |
| 779 | + {"content": "one"}, |
| 780 | + {"content": "two"}, |
| 781 | + {"content": "three"}, |
| 782 | + ] |
| 783 | + streaming_message_responses = [] |
| 784 | + |
| 785 | + with mock.patch( |
| 786 | + "sentry_sdk.integrations.openai.record_token_usage" |
| 787 | + ) as mock_record_token_usage: |
| 788 | + _calculate_chat_completion_usage( |
| 789 | + messages, response, span, streaming_message_responses, count_tokens |
| 790 | + ) |
| 791 | + mock_record_token_usage.assert_called_once_with(span, 11, 10, 10) |
| 792 | + |
| 793 | + |
| 794 | +def test_calculate_chat_completion_usage_c(): |
| 795 | + span = mock.MagicMock() |
| 796 | + |
| 797 | + def count_tokens(msg): |
| 798 | + return len(str(msg)) |
| 799 | + |
| 800 | + response = mock.MagicMock() |
| 801 | + response.usage = mock.MagicMock() |
| 802 | + response.usage.prompt_tokens = 20 |
| 803 | + response.usage.total_tokens = 20 |
| 804 | + messages = [] |
| 805 | + streaming_message_responses = [ |
| 806 | + "one", |
| 807 | + "two", |
| 808 | + "three", |
| 809 | + ] |
| 810 | + |
| 811 | + with mock.patch( |
| 812 | + "sentry_sdk.integrations.openai.record_token_usage" |
| 813 | + ) as mock_record_token_usage: |
| 814 | + _calculate_chat_completion_usage( |
| 815 | + messages, response, span, streaming_message_responses, count_tokens |
| 816 | + ) |
| 817 | + mock_record_token_usage.assert_called_once_with(span, 20, 11, 20) |
| 818 | + |
| 819 | + |
| 820 | +def test_calculate_chat_completion_usage_d(): |
| 821 | + span = mock.MagicMock() |
| 822 | + |
| 823 | + def count_tokens(msg): |
| 824 | + return len(str(msg)) |
| 825 | + |
| 826 | + response = mock.MagicMock() |
| 827 | + response.usage = mock.MagicMock() |
| 828 | + response.usage.prompt_tokens = 20 |
| 829 | + response.usage.total_tokens = 20 |
| 830 | + response.choices = [ |
| 831 | + mock.MagicMock(messge="one"), |
| 832 | + mock.MagicMock(messge="two"), |
| 833 | + mock.MagicMock(messge="three"), |
| 834 | + ] |
| 835 | + messages = [] |
| 836 | + streaming_message_responses = [] |
| 837 | + |
| 838 | + with mock.patch( |
| 839 | + "sentry_sdk.integrations.openai.record_token_usage" |
| 840 | + ) as mock_record_token_usage: |
| 841 | + _calculate_chat_completion_usage( |
| 842 | + messages, response, span, streaming_message_responses, count_tokens |
| 843 | + ) |
| 844 | + mock_record_token_usage.assert_called_once_with(span, 20, None, 20) |
| 845 | + |
| 846 | + |
| 847 | +def test_calculate_chat_completion_usage_e(): |
| 848 | + span = mock.MagicMock() |
| 849 | + |
| 850 | + def count_tokens(msg): |
| 851 | + return len(str(msg)) |
| 852 | + |
| 853 | + response = mock.MagicMock() |
| 854 | + messages = [] |
| 855 | + streaming_message_responses = None |
| 856 | + |
| 857 | + with mock.patch( |
| 858 | + "sentry_sdk.integrations.openai.record_token_usage" |
| 859 | + ) as mock_record_token_usage: |
| 860 | + _calculate_chat_completion_usage( |
| 861 | + messages, response, span, streaming_message_responses, count_tokens |
| 862 | + ) |
| 863 | + mock_record_token_usage.assert_called_once_with(span, None, None, None) |
0 commit comments