|
14 | 14 | RagPipeline, |
15 | 15 | RagPipelineFactory, |
16 | 16 | ) |
17 | | -from cairo_coder.core.types import Document, DocumentSource, Message, Role, StreamEventType |
| 17 | +from cairo_coder.core.types import ( |
| 18 | + Document, |
| 19 | + DocumentSource, |
| 20 | + Message, |
| 21 | + Role, |
| 22 | + StreamEventType, |
| 23 | + combine_usage, |
| 24 | +) |
18 | 25 | from cairo_coder.dspy.retrieval_judge import RetrievalJudge |
19 | 26 |
|
20 | 27 |
|
@@ -853,3 +860,88 @@ def test_create_pipeline_with_custom_components(self, mock_vector_store_config): |
853 | 860 | assert pipeline.config.max_source_count == 20 |
854 | 861 | assert pipeline.config.similarity_threshold == 0.6 |
855 | 862 | assert pipeline.config.sources == [DocumentSource.CAIRO_BOOK] |
| 863 | + |
| 864 | + |
| 865 | +class TestCombineUsage: |
| 866 | + """Tests for the combine_usage function.""" |
| 867 | + |
| 868 | + @pytest.mark.parametrize( |
| 869 | + "usage1,usage2,expected", |
| 870 | + [ |
| 871 | + # Test handling None values in usage dicts |
| 872 | + pytest.param( |
| 873 | + { |
| 874 | + "gpt-4": { |
| 875 | + "prompt_tokens": None, # Key exists but value is None |
| 876 | + "completion_tokens": 100, |
| 877 | + } |
| 878 | + }, |
| 879 | + { |
| 880 | + "gpt-4": { |
| 881 | + "prompt_tokens": 50, |
| 882 | + "completion_tokens": 50, |
| 883 | + } |
| 884 | + }, |
| 885 | + { |
| 886 | + "gpt-4": { |
| 887 | + "prompt_tokens": 50, |
| 888 | + "completion_tokens": 150, |
| 889 | + } |
| 890 | + }, |
| 891 | + id="none_values_in_usage_dict", |
| 892 | + ), |
| 893 | + # Test handling None values in nested dicts |
| 894 | + pytest.param( |
| 895 | + { |
| 896 | + "gpt-4": { |
| 897 | + "details": { |
| 898 | + "audio_tokens": None, # Key exists but value is None |
| 899 | + "cached_tokens": 100, |
| 900 | + } |
| 901 | + } |
| 902 | + }, |
| 903 | + { |
| 904 | + "gpt-4": { |
| 905 | + "details": { |
| 906 | + "audio_tokens": 25, |
| 907 | + "cached_tokens": 50, |
| 908 | + } |
| 909 | + } |
| 910 | + }, |
| 911 | + { |
| 912 | + "gpt-4": { |
| 913 | + "details": { |
| 914 | + "audio_tokens": 25, |
| 915 | + "cached_tokens": 150, |
| 916 | + } |
| 917 | + } |
| 918 | + }, |
| 919 | + id="none_values_in_nested_dict", |
| 920 | + ), |
| 921 | + # Test basic combining of usage dicts |
| 922 | + pytest.param( |
| 923 | + {"gpt-4": {"prompt_tokens": 100, "completion_tokens": 50}}, |
| 924 | + {"gpt-4": {"prompt_tokens": 200, "completion_tokens": 100}}, |
| 925 | + {"gpt-4": {"prompt_tokens": 300, "completion_tokens": 150}}, |
| 926 | + id="basic_combining", |
| 927 | + ), |
| 928 | + # Test combining with empty dicts |
| 929 | + pytest.param( |
| 930 | + {}, |
| 931 | + {}, |
| 932 | + {}, |
| 933 | + id="both_empty", |
| 934 | + ), |
| 935 | + # Test combining with one empty dict |
| 936 | + pytest.param( |
| 937 | + {"gpt-4": {"tokens": 100}}, |
| 938 | + {}, |
| 939 | + {"gpt-4": {"tokens": 100}}, |
| 940 | + id="second_empty", |
| 941 | + ), |
| 942 | + ], |
| 943 | + ) |
| 944 | + def test_combine_usage(self, usage1, usage2, expected): |
| 945 | + """Test combine_usage with various input scenarios.""" |
| 946 | + result = combine_usage(usage1, usage2) |
| 947 | + assert result == expected |
0 commit comments