diff --git a/lib/crewai-files/tests/fixtures/sample_audio.wav b/lib/crewai-files/tests/fixtures/sample_audio.wav new file mode 100644 index 000000000..745d30e86 Binary files /dev/null and b/lib/crewai-files/tests/fixtures/sample_audio.wav differ diff --git a/lib/crewai/tests/cassettes/llms/TestGeminiMultimodalIntegration.test_analyze_audio_file.yaml b/lib/crewai/tests/cassettes/llms/TestGeminiMultimodalIntegration.test_analyze_audio_file.yaml new file mode 100644 index 000000000..85b1480c3 --- /dev/null +++ b/lib/crewai/tests/cassettes/llms/TestGeminiMultimodalIntegration.test_analyze_audio_file.yaml @@ -0,0 +1,66 @@ +interactions: +- request: + body: '{"contents": [{"parts": [{"text": "Describe what you hear in this audio + in one sentence. Be brief."}, {"inlineData": {"data": "UklGRqQ-AABXQVZFZm10IBAAAAABAAEAQB8AAIA-AAACABAAZGF0YYA-AAAAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__yAAABDXkYDSG3Je0lpiFkGSIONAEj9Hjold-H2ujZyt235cDwl_22CpEWwh8xJTomviImG1kQnQN09mvq8OAh267Zw9wD5JLuMPtgCJMUVx6EJGEmsyPNHH8SAQbP-HXsauLg25rZ4Ntq4nXsz_gBBn8SzRyzI2EmhCRXHpMUYAgw-5LuA-TD3K7ZIdvw4GvqdPadA1kQJhu-IjomMSXCH5EWtgqX_cDwt-XK3ejZh9qV33joI_Q0ASIOZBmmIe0ltyUNIXkYAQ0AAP_yh-fz3knaE9pa3pzm3vHM_t0LiBdrIHklGCY2IkkaQA9pAkr1b-k-4M_axtlC3drkp-9j_IwJlRUQH98kUiY9I_0bbhHQBKD3beup4Xzbn9lN3DPjge3_-TEHixOWHSAkZiYgJJYdixMxB__5ge0z403cn9l826nhbeug99AEbhH9Gz0jUibfJBAflRWMCWP8p-_a5ELdxtnP2j7gb-lK9WkCQA9JGjYiGCZ5JWsgiBfdC8z-3vGc5lreE9pJ2vPeh-f_8gAAAQ15GA0htyXtJaYhZBkiDjQBI_R46JXfh9ro2crdt-XA8Jf9tgqRFsIfMSU6Jr4iJhtZEJ0DdPZr6vDgIduu2cPcA-SS7jD7YAiTFFcehCRhJrMjzRx_EgEGz_h17Gri4Nua2eDbauJ17M_4AQZ_Es0csyNhJoQkVx6TFGAIMPuS7gPkw9yu2SHb8OBr6nT2nQNZECYbviI6JjElwh-RFrYKl_3A8Lflyt3o2Yfald946CP0NAEiDmQZpiHtJbclDSF5GAENAAD_8ofn895J2hPaWt6c5t7xzP7dC4gXayB5JRgmNiJJGkAPaQJK9W_pPuDP2sbZQt3a5KfvY_yMCZUVEB_fJFImPSP9G24R0ASg923rqeF825_ZTdwz44Ht__kxB4sTlh0gJGYmICSWHYsTMQf_-YHtM-NN3J_ZfNup4W3roPfQBG4R_Rs9I1Im3yQQH5UVjAlj_Kfv2uRC3cbZz9o-4G_pSvVpAkAPSRo2IhgmeSVrIIgX3QvM_t7xnOZa3hPaSdrz3ofn__IAAAENeRgNIbcl7SWmIWQZIg40ASP0eOiV34fa6NnK3bflwPCX_bYKkRbCHzElOia-IiYbWRCdA3T2a-rw4CHbrtnD3APkku4w-2AIkxRXHoQkYSazI80cfxIBBs_4dexq4uDbmtng22ridezP-AEGfxLNHLMjYSaEJFcekxRgCDD7ku4D5MPcrtkh2_Dga-p09p0DWRAmG74iOiYxJcIfkRa2Cpf9wPC35crd6NmH2pXfeOgj9DQBIg5kGaYh7SW3JQ0heRgBDQAA__KH5_PeSdoT2lrenObe8cz-3QuIF2sgeSUYJjYiSRpAD2kCSvVv6T7gz9rG2ULd2uSn72P8jAmVFRAf3yRSJj0j_RtuEdAEoPdt66nhfNuf2U3cM-OB7f_5MQeLE5YdICRmJiAklh2LEzEH__mB7TPjTdyf2XzbqeFt66D30ARuEf0bPSNSJt8kEB-VFYwJY_yn79rkQt3G2c_aPuBv6Ur1aQJAD0kaNiIYJnklayCIF90LzP7e8ZzmWt4T2kna896H5__y", + "mimeType": "audio/x-wav"}}], "role": "user"}], "generationConfig": {}}' + headers: + User-Agent: + - X-USER-AGENT-XXX + accept: + - '*/*' + accept-encoding: + - ACCEPT-ENCODING-XXX + connection: + - keep-alive + content-length: + - '21593' + content-type: + - application/json + host: + - generativelanguage.googleapis.com + x-goog-api-client: + - google-genai-sdk/1.49.0 gl-python/3.12.10 + x-goog-api-key: + - X-GOOG-API-KEY-XXX + method: POST + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent + response: + body: + string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": + [\n {\n \"text\": \"I hear a ringtone.\\n\"\n }\n + \ ],\n \"role\": \"model\"\n },\n \"finishReason\": + \"STOP\",\n \"avgLogprobs\": -0.88364137922014507\n }\n ],\n \"usageMetadata\": + {\n \"promptTokenCount\": 39,\n \"candidatesTokenCount\": 7,\n \"totalTokenCount\": + 46,\n \"promptTokensDetails\": [\n {\n \"modality\": \"TEXT\",\n + \ \"tokenCount\": 14\n },\n {\n \"modality\": \"AUDIO\",\n + \ \"tokenCount\": 25\n }\n ],\n \"candidatesTokensDetails\": + [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 7\n }\n + \ ]\n },\n \"modelVersion\": \"gemini-2.0-flash\",\n \"responseId\": + \"o_VyaeP8DKSOjMcP0ru68Q4\"\n}\n" + headers: + Alt-Svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + Content-Type: + - application/json; charset=UTF-8 + Date: + - Fri, 23 Jan 2026 04:14:27 GMT + Server: + - scaffolding on HTTPServer2 + Server-Timing: + - gfet4t7; dur=869 + Transfer-Encoding: + - chunked + Vary: + - Origin + - X-Origin + - Referer + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + X-Frame-Options: + - X-FRAME-OPTIONS-XXX + X-XSS-Protection: + - '0' + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/cassettes/llms/TestGeminiMultimodalIntegration.test_analyze_video_file.yaml b/lib/crewai/tests/cassettes/llms/TestGeminiMultimodalIntegration.test_analyze_video_file.yaml new file mode 100644 index 000000000..92bd26c82 --- /dev/null +++ b/lib/crewai/tests/cassettes/llms/TestGeminiMultimodalIntegration.test_analyze_video_file.yaml @@ -0,0 +1,67 @@ +interactions: +- request: + body: '{"contents": [{"parts": [{"text": "Describe what you see in this video + in one sentence. Be brief."}, {"inlineData": {"data": "AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAHsZtZGF0AAACrwYF__-r3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE2NCByMzE5MSA0NjEzYWMzIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAyNCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTExIGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2FkYXB0PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtleWludD0yNTAga2V5aW50X21pbj0yNCBzY2VuZWN1dD00MCBpbnRyYV9yZWZyZXNoPTAgcmNfbG9va2FoZWFkPTQwIHJjPWNyZiBtYnRyZWU9MSBjcmY9MjMuMCBxY29tcD0wLjYwIHFwbWluPTAgcXBtYXg9NjkgcXBzdGVwPTQgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAAQdliIQAM__-3zL4FEXSdBJq5ZU3MJcdjcXcqxS_NYf0tBgsiAAAAwAAAwAAAwJGJfsNAqMeV-wAAAMBPABHAaIO0K6IuN4V-CW5BgA6cj9UrIMdlOMRFLwqwOXui4MmJ_Qug8cnD7OyzWd8fkO7g6v9Usn0LK3lOT2_OpGOX1OHSDEo7sSAg7TS3ifydLhdISUFGDfGxDAstID4Yt8myCwPkA13JCSfzhJNjQ3cpNpxPNbOj0cSLhXKcUAED5L9wB2mEFFxDScBi3xoU2BBfq6JBFEiek7bqFHC5eoOY7c5VJIzWsAkvkgEwgSsuGyYjoDdYCz_p7fAQcFnuyoDmAAAAwAAAwATMQAAAHZBmiJsQv_-jLAAAgJlZVdtDJMANcWoTYugEm1Az9JgfOzpsvdqsCMiibWITi5gx8foq-j-o1JH5N3dOrtkRUKF7TLkSL4XM_qNeglpYWeFo_f9Ov2ajDV7YClaV4wMyjMh8K0lxTU-oLhjOr8HS3LmurhV1DfgAAAANwGeQXkK_wAAbAC9c9AAghCV-TTPgFb3rKwALK98H9w5PtSIoTbw4T2gNCyOyZBatJqzMbVLD0kAAABCQZpDPCGTKYQr__44QAAHvxUh7N76GAVP2gG1Qdf8qJ07563ffcO4t3_mUhoqZ7exAwdcTHPco3aR1Coe8vTE6g6oAAAARUGaZUnhDyZTBTwr__44QAAHy3_9jc7e2kANEMATITEW5B8gFuybki22_NO0s8mE3SjlH-MD51Wsu06nTbtldhYK0HeDfwAAACwBnoRqQr8AASpVIKsEEJ5DHOZ5tqvMz8iiVXNIWdZKjc9QmL6YDhcXqTRSQQAAADRBmoZJ4Q8mUwIV__44QAAHkxfR34Z17X-nIvZosqVk3DPKhi5pMIrjz9cfOXitTugAEFlBAAAAPEGap0nhDyZTAhX__jhAAAeTFJeH2fGzW-iNwf7zbzyXg9vBPA8c9KWUNkwUWCFzrChUyyM3uKEuTvLBbQAAAD1BmslJ4Q8mUwURPDP__p4QAAHy4TnuGHay0IcbBMIZVrMXwWZV3kHZP4P6cY0rF3PP3HTzHRijaq-SaFBAAAAAKQGe6GpCvwABKlUh3hVwWvopQ7Y6wl4jp24qMRokq8vxImFFnYtmuQ5YAAAAPEGa6knhDyZTAhv__qeEAAB8AXiYEeglsHuUofRYsfvEMPBEAFQab1ndLc1hE03fy2KlhM5mstzjfAoPWQAAAENBmwxJ4Q8mUwURPDP__p4QAAHn4TnfPGrTN9_WoAIED37_Hdeid4lVYaskQbii-qUiUia5_Q1pWadOV4NPObs5hBdwAAAALwGfK2pCvwABKlUh2JWcqsTxMrUdWx6pBM5Hxqfe0lacHrghNRVgiXLG2PNzaFJAAAAAMkGbLUnhDyZTAhn__p4QAAHZ84daK8C3WYeftlntePbtTg-GlGkb4Og60qGpiaAaWIOBAAAAOkGbTknhDyZTAhv__qeEAAB5QV1gR6CLnN0PosWODPmvHgePIAT4FA6Fl3R8gHiu2cth4Ajm9XxyRU0AAAA8QZtwSeEPJlMFETwz__6eEAAB3OE51qhSWESje0_hzovx-uvLthCyE1TcdBmvTfPSrXHg7_wLoMd_aFTBAAAALgGfj2pCvwABKlUh0xvwqgBdvmvVjV6k9d-iccfc76S48GWv6tl0MuOfwzFRoVMAAAAyQZuRSeEPJlMCGf_-nhAAAc7zh1rd6FmJZMUE9xyiaL6PYOjnXgQbJQzh3wDoBJrkBgQAAABzQZuySeEPJlMCG__-p4QAAHc4TyXxjMACEk0tq6pWCEXq94kuCZAu87BXPaVvatodufkSaxWNEWH46wVFIWR1FU5SOAJfD2RHv1-QsYsrgrE8kucwj-cO8XPjVFhyu2leJCXVuH-55LolxrBw32Qvjpwm4QAAAD9Bm9RJ4Q8mUwURPDP__p4QAAHD9Swh4ASaWBu96JQw-k51049EdSbcla-mi00EyrbhTjTOPcEE_x0hTqDgOqAAAAArAZ_zakK_AAEqVSHJDXd7PmywZ6NBUgjltz5pHUsurfvz1gcKan2T5OWIuAAAADpBm_VJ4Q8mUwIb__6nhAAAc9dxqelT2Dxqb6AVV-8Lz85ICnqPI6nZPxdyM_hkpJ0MQcDCTa9iiwpJAAAAOkGaF0nhDyZTBRE8M__-nhAAAcbhOdalglhEfttQrJ0dEbHkehQNTkkiTwhLZugyvn7UvmL8pZzCDKgAAAArAZ42akK_AAEqVSHJG_BbAXOewNUrok-9cmsVBjXPfpaU0gb0fWLGwFiDKwAAADBBmjhJ4Q8mUwIZ__6eEAABuZ9dBEB2QqJWVgFkBiH4z8aGN5A1OOVGVKSkIbP3FTEAAAAwQZpZSeEPJlMCG__-p4QAAHG4TzUqKuc4RO-SjM3YribHH-zzAL-i-MgGoRUyAiTgAAAAOEGae0nhDyZTBRE8M__-nhAAAa9e7RY8xzhmPRWFpVTbLXv6TL-UU0xFC9Hp-hvn8YKJjC2UZMYFAAAAJwGemmpCvwABKlUhv0HI7k0qiqdT68B_SF8Q4F-nLAdIdq2F5ZAesAAAADpBmpxJ4Q8mUwIb__6nhAAAblzr0qeweRTf-x2Vj94hh4IgAqDTes7pbmsImm7-hR0pRFTCTa55LBqRAAAAOkGavknhDyZTBRE8M__-nhAAAbHhOdaoUlhEo3tQrJ0dEbHkehQNTkkiTwhLZugyvn7Uvo6-U_JhBqUAAAA8AZ7dakK_AAEqVSG_G_CqlYAPLLNoR_eR233-mUj5VXPPeRD3ukQsm4x-RZNtgVBGvKgQ8QIDwySxuyIWAAAAM0Ga30nhDyZTAhn__p4QAAGlXYVjy8FmPRWFpVTbLXv6TL-UU0xFC9HjQUnQ6qCtToUUEAAAAEhBmuBJ4Q8mUwIb__6nhAAAbHhPNUbEdl8wiAEEGGqNy-MBC37Vjci9iIpPdo4-4J0iHfy0YUylmHt5bjyNt7hr4oDFJefEjAkAAAAzQZsCSeEPJlMFETwz__6eEAABm17tFj5hjUE9RUUoDJa_sWAdW5WHx5yZrHuA0Y4Pr8GzAAAAJwGfIWpCvwABKlUhtUHI7k0qiqdT68B_SF8Q4F-nLAdIdq2F5ZAgYQAAADdBmyNJ4Q8mUwIb__6nhAAAaVzr0qeweRTf-x2UvFpDFlAtQoUrVlOyhYj1qzf9CjwGRDAW0kYsAAAAPEGbRUnhDyZTBRE8M__-nhAAAZ3hOeJ1tJLFBxzhYQyrWYhQsxgH4dk_jfvxPeLn5KcadFcoV-S1JqXhGwAAACsBn2RqQr8AASpVIbUb8FsBc57A1SuiT71yaxUGNc9-lpTSBvR9YsbAWIN7AAAAL0GbZknhDyZTAhn__p4QAAGRXexY-YY1BPUVFKAyWv7FgHVuVh8ecmaxpbrzWKCBAAAAOUGbh0nhDyZTAhv__qeEAABm3OvSp7B5FN_7HZWP3iGHgiACoNN6zuluawiabv6E4ByYFc-6GM-K2QAAAD5Bm6lJ4Q8mUwURPDP__p4QAAGT4TnidVqSxQb9wWEMq1i1DbPi0gzZRUvYhbMabBNUS_aLygr20Gh-cog44AAAACkBn8hqQr8AASpVIbBFFFr6KUO2OsJeI6duKjEaJKvL8SJhRZ2LZrkSMAAAADpBm8pJ4Q8mUwIb__6nhAAAZF0ClKnsIAPfG_9jsrH7xDDwRABUGm9Z3S3NYRNN38ts5pyl7PZURiVhAAAARkGb7EnhDyZTBRE8M__-nhAAAYnhOd88atM339agAgQPfwZFuuxS8SqsNWSINxRfVKRKRNc_oa0rNOnK8GncHy7eOzsGi7gAAAAvAZ4LakK_AAEqVSGrxUCqxPEytR1bHqkEzkfGp97SVpweuCE1FWCJbtC-ElxkSsAAAAAyQZoNSeEPJlMCGf_-nhAAAX1dhWPLwLdZh5-2We149u1OD4aUaRvg6DrSoamJoBpYqYEAAAA9QZouSeEPJlMCG__-p4QAAGHc69KnsHkU3_sdlY4M-a8eB48gBPgUDoWXdHyAeK7Z5CckIJol-vGY2cwPWQAAADxBmlBJ4Q8mUwURPDP__p4QAAF_4TnWqFJYRKN7UKydF-P118GyR7vNgsykiIVZ_whhSOUvl2jqeP6l4TMAAAAvAZ5vakK_AAEqVSGnRRSqAF2-a9WNqJHD4kNfhoFHm0rvXJyzIrRtZVGR_L-yJmAAAAAwQZpxSeEPJlMCGf_-nhAAAXOthWR96FmJZMUE9xyiaL6PYOjnXgQbJQ-0OwhR-4yoAAAANUGakknhDyZTAhv__qeEAABf-E81KirnOETvkozN2K4mxx_s8wC_ovjIBuVdaKOUcphiXB6RAAAAM0GatEnhDyZTBRE8M__-nhAAAWqu7RY8xzhmPRWFpVTbLXv6TL-UU0xFC9Hp-W7NldgSsAAAACgBntNqQr8AASpVIZ44ZVjYuNihvugKbWvQmjdXxErS-MGHMDdCBwHpAAAAN0Ga1UnhDyZTAhv__qeEAABdABiHSp7B-G6CQgJmULgNHICf_pSiW5_C4aGpAb36eRQfXbMkb0EAAAA8QZr3SeEPJlMFETwz__6eEAABbOZc61LBLCI_bahWTo6I2PI9CganJJEnhCWzdBl6CJsvYsN-cd8O8KGAAAAAKwGfFmpCvwABKlUhnkUUWwFznsDVK6JPvXJrFQY1z36WlNIG9H1ixsBYg-cAAAAvQZsYSeEPJlMCGf_-nhAAAWGthWPLwWY9FYWlVNste_pMv5RTTEUL0eNO6QPYEzEAAABIQZs5SeEPJlMCG__-p4QAAFs5l2rI3jMvmEQAggw1RuXxgIW_asbkXsRFJ7tHH3BOkQ7-WjCmUsw9vKcYz94b7qaLdp8-JHHAAAAANkGbW0nhDyZTBRE8M__-nhAAAViu7RY-YY1BPUVFKAyWv7FgHVuVh8ecmax7gNJFfBSa_1-D_QAAACgBn3pqQr8AASpVIZU4ZVjYuNihvugKbWvQmjdXxErS-MGHMDdCBwH-AAAANEGbfEnhDyZTAhv__qeEAABYgBiHSp7B-G6CQgJmDFNvc78e6iaC9ubCNOGo7x9-oeZI6YEAAAA5QZueSeEPJlMFETwz__6eEAABWuZc61DksIid2oVkxNEbHkehQNTkkiTwhLZugyvn7UvmL8otMIQdAAAAKwGfvWpCvwABKlUhlUUUWwFznsDVK6JPvXJrFQY1z36WlNIG9H1ixsBYhBwAAAA2QZu_SeEPJlMCGf_-nhAAAU-t7Fj7VOAsx6KwtKqbZa9_SZfyimmIoXo8-lAOh1UKsvyJiEHAAAAAOkGbwEnhDyZTAhv__qeEAABWuZdqyN41DSjX33rYP3PwUbMHUj1GaXJmcCxaQl3M8UOoH8Vwb52Swh8AAAAzQZviSeEPJlMFETwz__6eEAABRq7tFj5hjUE9RUUoDJa_sWAdW5WHx5yZrHuA0Y4Pr8IeAAAAJwGeAWpCvwABKlUhjPQkm4q-jy_0K8B_SF8Q4F-nLAdIdq2F5ZApoQAAADdBmgNJ4Q8mUwIb__6nhAAAU_Dr0qeweRTf-x2Vj94hh4IgAqDTes7pbmsImm7-hR4DIhgLaSPSAAAAPkGaJUnhDyZTBRE8M__-nhAAAUjmXPE62klig45wsIZVrFqG2fFpBmyipexC2Y02Caol-0XlBYroNFJ5RCLhAAAAKwGeRGpCvwABKlUhjNcUWwFznsDVK6JPvXJrFQY1z36WlNIG9H1ixsBYhF0AAAAvQZpGSeEPJlMCGf_-nhAAAT2thWPLwWY9FYWlVNste_pMv5RTTEUL0eNO6QPYFVEAAAA9QZpnSeEPJlMCG__-p4QAAFGxApSp7B5IZf-x2Vj94hh4IgAqDTes7pbmsImm7-o30WLTBIGNXbenlaQYEQAAADZBmolJ4Q8mUwURPDP__p4QAAE_5lzvnjVppjrYWELZoSJb4EGdOlpVpVCAd83rD8D4KmV4XEAAAAApAZ6oakK_AAEqVSGI1xRa-ilDtjrCXiOnbioxGiSry_EiYUWdi2a5FxAAAAAvQZqqSeEPJlMCGf_-nhAAATUPVfYeZ1fcpg6oIp1RNF9HsHRzrwINkoZjY1dwK-EAAAA5QZrLSeEPJlMCG__-p4QAAE_5l2CWlGxI7Qv9URgQ8Z2bl3opFBzWsfPmkYmfyJpp1Nr7U_rwwCEnAAAAOkGa7UnhDyZTBRE8M__-nhAAAS0QePJAA0IWKAYcvUDmdqNK_tEdSbcla-mi00EyrbhTjTOPb3KSsakAAAAoAZ8MakK_AAEqVSGAymVY2LjYob7oCm1r0Jo3V8RK0vjBhzA3QgcCTwAAADVBmw5J4Q8mUwIb__6nhAAATVL0h0qeweOGXzmwv3hefaimFvnqTtMn2HSj-87KV2QLGeBBwQAAADtBmzBJ4Q8mUwURPDP__p4QAAEu6b0BVHbWWdBGwHUXcfuMX1lLSAJkgzztHdty4eDNZzkvYGYA_-tEHQAAAC4Bn09qQr8AASpVIYDXQKrE8TK1oSv6cjDVX5BQ5Tz87qfv645wRKec9b5M-GDAAAAAMEGbUUnhDyZTAhn__p4QAAElD1X2HmdX3KYOqCKdUTRfR7B0c68CDZKH2h2EHU3HzAAAAEJBm3JJ4Q8mUwIb__6nhAAAS7pvYJaUbEjtC_1REjmDOzWlH0vriihLwS7_Wg6WqjSHH-dtmW0P-yXmCMKpBj04ekEAAAA6QZuUSeEPJlMFETwz__6eEAABHRB48kADxqVeS9hqpWdqNK_tEdSbcla-mi00EyrbhTjTOPb3KSsb0AAAACoBn7NqQr8AASpVIXj0JJ94OTwUxP4VuIP7MktUYvsrwaEqAoGI1sowLyAAAABCQZu1SeEPJlMCG__-p4QAAElHZ9BurzyP93oBj26WaMeFpmb0JH1IzjvtOv2x1rFhY4cPfgBVh-oL6pG7LpKwkwoJAAAAO0Gb10nhDyZTBRE8M__-nhAAAR7pvPE62klg-EeWELbziOsDOskW1Tbbi7mxuf_jai4Lu0zDh7swhCggAAAALwGf9mpCvwABKlUheNdAqsTxMrUdWx6pBM5Hxqfe0lacHrghNRVgiXLG2PNzaIuBAAAAMEGb-EnhDyZTAhn__p4QAAEVQ_NVkfehUo1maTYLCNjPxoY3kDU45UZUpKQhhTcg4QAAADVBmhlJ4Q8mUwIb__6nhAAAR7pvarYTPBtCeLQMzdiuJscf7PMAv6L4yAbdA_5H9p1ns-BLwAAAADNBmjtJ4Q8mUwURPDP__p4QAAENEHjPWHA4Zj0VhaVU2y17-ky_lFNMRQvR6fluzZXYGNEAAAAoAZ5aakK_AAEqVSFyQdWeILjYob7oCm1r0Jo3V8RK0vjBhzA3QgcCkgAAADZBmlxJ4Q8mUwIb__6nhAAARUdoCRuweRTf-x2Vj94hh4IgAqDTes7pbmsImm7-hNopfCRYVMEAAAA6QZp-SeEPJlMFETwz__6eEAABDum861QpLCJRvahWTo6I2PI9CganJJEnhCWzdBlfP2pfMX5T8mEKmQAAADwBnp1qQr8AASpVIXJKuFVKwAeWWbQj-8jtvv9MpHyquee8iHvdIhZNxj8iybbAqCNeVAh4gQHhkljdkasAAAAxQZqfSeEPJlMCGf_-nhAAAQUPVfWGUWY9FYWlVNste_pMv5RTTEUL0eNZuy-Rn6yQcAAAAEhBmqBJ4Q8mUwIb__6nhAAAQ7pvasjeMy-YRACCDDVG5fGAhb9qxuRexEUnu0cfcE6RDv5aMKZSzD28tx5G29w18UBikvPiSXkAAAAxQZrCSeEPJlMFETwz__6eEAAA_XqV-tIwxqCeoqKUBktf2LAOrcrD485M1j2915rHpAAAACcBnuFqQr8AASpVIWzeLHcmlUVTqfXgP6QviHAv05YDpDtWwvLIGhEAAAA3QZrjSeEPJlMCG__-p4QAAEFHaAkbsHkU3_sdlLxaQxZQLUKFK1ZTsoWI9as3_Qo8BkQwFtJJuAAAAD1BmwVJ4Q8mUwURPDP__p4QAAD-8JzxOtpJYoOOcLCGVazEKFmMA_Dsn8b9-J7xc_JTjTorlCvyWpNS8N-BAAAALwGfJGpCvwABKlUhbMrOVWJ4mVqOrY9Ugmcj41PvaStOD1wQmoqwRLdoXwkuMjfhAAAAMUGbJknhDyZTAhn__p4QAAD3-f_rSMMagnqKilAZLX9iwDq3Kw-POTNY0waMcH1-FlEAAAA5QZtHSeEPJlMCG__-p4QAAD9grrAj0EXObofRYsfvEMPBEAFQab1ndLc1hE03f0JwDkwK590MZ8h5AAAAQEGbaUnhDyZTBRE8M__-nhAAAPlwnPE6rUlig37gsIZVrFqG2fFpBmyipexC2Y02Caol-0XlBXt3fPAxSpIIipgAAAAvAZ-IakK_AAEqVSFqCs5VYniZWo6tj1SCZyPjU-9pK04PXBCairBEt2hdThf4csAAAAAxQZuKSeEPJlMCGf_-nhAAAPJ5w61u9CzEsmKCe45RNF9HsHRzrwINkoZjY4gMSqm5LwAAADlBm6tJ4Q8mUwIb__6nhAAAPlwnk2gE8_jtC_1RGBDxnZuXeikUHNax8-aRiZ_ImmnU2vtT-vDAIXcAAAA6QZvNSeEPJlMFETwz__6eEAAA7PqWEPAB-AzAAw5eoHM7UaV_aI6k25K19NFpoJlW3CnGmce3uUlZBwAAACgBn-xqQr8AASpVIWSGhHX8XGxQ33QFNrXoTRur4iVpfGDDmBuhA4F3AAAAO0Gb7knhDyZTAhv__qeEAAA8qPFEJG7B44ZfObC_eF59qKYW-epO0yfYdKP7zspXZanNUgjxFms-IJFxAAAAOkGaEEnhDyZTBRE8M__-nhAAAO5wnOtQ5LCIndqFWuT5UM1-_WI2M1FjlMsWzDGyD5O76HkV3TgEMCEAAAArAZ4vakK_AAEqVSFkjfgtgLnPYGqV0SfeuTWKgxrnv0tKaQN6PrFjYCxDAgAAADJBmjFJ4Q8mUwIZ__6eEAAA56nVada3ehUyuVgFlUhD8febxs6UDVwvVJCz0YCcWUDAgAAAAD9BmlJJ4Q8mUwIb__6nhAAAO5wnkzV05bO4Zr6kmaslAzNFyGuKJ_YtrGppdLUNCCtMq2zDAuwkKbDYdwWwf4EAAAA6QZp0SeEPJlMFETwz__6eEAAA4fqWEPACS7KvJew1UrO1Glf2iOpNuStfTRaaCZVtwpxpnHt7lJWRcAAAACoBnpNqQr8AASpVIV-g5HlqHJ4KYn8K3EH9mSWqMX2V4NCVAUDEa2UYHVAAAAA5QZqVSeEPJlMCGf_-nhAAAOH5w60WklSWBZU27WeEhl_F4cjZjyILXZ3rvHIuTlEgCfYQum3ccDLhAAAAOEGat0nhDyZTBRE8K__-OEAAA3fqN-riVnNwXhKSqg0FJABRFfQyuVomrdcfiA7QVt1E62D73jlgAAAALQGe1mpCvwABKlUhX44OVWJ4l3VNCsQk-LJGysmQ89xlYakmCLN3TfdeBpC2gQAACDptb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAATiAABAAABAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAHZXRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAEAAAAAAAATiAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAACgAAAAWgAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAAE4gAAAQAAAEAAAAABt1tZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAADAAAADwAFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAaIbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAAGSHN0YmwAAACwc3RzZAAAAAAAAAABAAAAoGF2YzEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAACgAFoAEgAAABIAAAAAAAAAAEUTGF2YzYxLjMuMTAwIGxpYngyNjQAAAAAAAAAAAAAAAAY__8AAAA2YXZjQwFkAB7_4QAZZ2QAHqzZQKAv-WEAAAMAAQAAAwAwDxYtlgEABmjr48siwP34-AAAAAAUYnRydAAAAAAAADEwAAAxMAAAABhzdHRzAAAAAAAAAAEAAAB4AAACAAAAABRzdHNzAAAAAAAAAAEAAAABAAADQGN0dHMAAAAAAAAAZgAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAAAIAAAQAAAAAAQAABgAAAAABAAACAAAAAAEAAAQAAAAAAQAABgAAAAABAAACAAAAABxzdHNjAAAAAAAAAAEAAAABAAAAeAAAAAEAAAH0c3RzegAAAAAAAAAAAAAAeAAAA74AAAB6AAAAOwAAAEYAAABJAAAAMAAAADgAAABAAAAAQQAAAC0AAABAAAAARwAAADMAAAA2AAAAPgAAAEAAAAAyAAAANgAAAHcAAABDAAAALwAAAD4AAAA-AAAALwAAADQAAAA0AAAAPAAAACsAAAA-AAAAPgAAAEAAAAA3AAAATAAAADcAAAArAAAAOwAAAEAAAAAvAAAAMwAAAD0AAABCAAAALQAAAD4AAABKAAAAMwAAADYAAABBAAAAQAAAADMAAAA0AAAAOQAAADcAAAAsAAAAOwAAAEAAAAAvAAAAMwAAAEwAAAA6AAAALAAAADgAAAA9AAAALwAAADoAAAA-AAAANwAAACsAAAA7AAAAQgAAAC8AAAAzAAAAQQAAADoAAAAtAAAAMwAAAD0AAAA-AAAALAAAADkAAAA_AAAAMgAAADQAAABGAAAAPgAAAC4AAABGAAAAPwAAADMAAAA0AAAAOQAAADcAAAAsAAAAOgAAAD4AAABAAAAANQAAAEwAAAA1AAAAKwAAADsAAABBAAAAMwAAADUAAAA9AAAARAAAADMAAAA1AAAAPQAAAD4AAAAsAAAAPwAAAD4AAAAvAAAANgAAAEMAAAA-AAAALgAAAD0AAAA8AAAAMQAAABRzdGNvAAAAAAAAAAEAAAAwAAAAYXVkdGEAAABZbWV0YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAsaWxzdAAAACSpdG9vAAAAHGRhdGEAAAABAAAAAExhdmY2MS4xLjEwMA==", + "mimeType": "video/mp4"}}], "role": "user"}], "generationConfig": {}}' + headers: + User-Agent: + - X-USER-AGENT-XXX + accept: + - '*/*' + accept-encoding: + - ACCEPT-ENCODING-XXX + connection: + - keep-alive + content-length: + - '13566' + content-type: + - application/json + host: + - generativelanguage.googleapis.com + x-goog-api-client: + - google-genai-sdk/1.49.0 gl-python/3.12.10 + x-goog-api-key: + - X-GOOG-API-KEY-XXX + method: POST + uri: https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent + response: + body: + string: "{\n \"candidates\": [\n {\n \"content\": {\n \"parts\": + [\n {\n \"text\": \"A white square moves from the left + side of a blue background to the center and then to the right side.\\n\"\n + \ }\n ],\n \"role\": \"model\"\n },\n \"finishReason\": + \"STOP\",\n \"avgLogprobs\": -0.31009365164715313\n }\n ],\n \"usageMetadata\": + {\n \"promptTokenCount\": 1304,\n \"candidatesTokenCount\": 23,\n \"totalTokenCount\": + 1327,\n \"promptTokensDetails\": [\n {\n \"modality\": \"VIDEO\",\n + \ \"tokenCount\": 1290\n },\n {\n \"modality\": \"TEXT\",\n + \ \"tokenCount\": 14\n }\n ],\n \"candidatesTokensDetails\": + [\n {\n \"modality\": \"TEXT\",\n \"tokenCount\": 23\n + \ }\n ]\n },\n \"modelVersion\": \"gemini-2.0-flash\",\n \"responseId\": + \"l_VyaaW_GobSjMcPuKOv2A4\"\n}\n" + headers: + Alt-Svc: + - h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 + Content-Type: + - application/json; charset=UTF-8 + Date: + - Fri, 23 Jan 2026 04:14:18 GMT + Server: + - scaffolding on HTTPServer2 + Server-Timing: + - gfet4t7; dur=3176 + Transfer-Encoding: + - chunked + Vary: + - Origin + - X-Origin + - Referer + X-Content-Type-Options: + - X-CONTENT-TYPE-XXX + X-Frame-Options: + - X-FRAME-OPTIONS-XXX + X-XSS-Protection: + - '0' + status: + code: 200 + message: OK +version: 1 diff --git a/lib/crewai/tests/llms/test_multimodal_integration.py b/lib/crewai/tests/llms/test_multimodal_integration.py index a6d57303c..52628e496 100644 --- a/lib/crewai/tests/llms/test_multimodal_integration.py +++ b/lib/crewai/tests/llms/test_multimodal_integration.py @@ -9,13 +9,23 @@ from pathlib import Path import pytest from crewai.llm import LLM -from crewai_files import File, ImageFile, PDFFile, TextFile, format_multimodal_content +from crewai_files import ( + AudioFile, + File, + ImageFile, + PDFFile, + TextFile, + VideoFile, + format_multimodal_content, +) # Path to test data files TEST_FIXTURES_DIR = Path(__file__).parent.parent.parent.parent / "crewai-files" / "tests" / "fixtures" TEST_IMAGE_PATH = TEST_FIXTURES_DIR / "revenue_chart.png" TEST_TEXT_PATH = TEST_FIXTURES_DIR / "review_guidelines.txt" +TEST_VIDEO_PATH = TEST_FIXTURES_DIR / "sample_video.mp4" +TEST_AUDIO_PATH = TEST_FIXTURES_DIR / "sample_audio.wav" @pytest.fixture @@ -30,6 +40,22 @@ def test_text_bytes() -> bytes: return TEST_TEXT_PATH.read_bytes() +@pytest.fixture +def test_video_bytes() -> bytes: + """Load test video bytes.""" + if not TEST_VIDEO_PATH.exists(): + pytest.skip("sample_video.mp4 fixture not found") + return TEST_VIDEO_PATH.read_bytes() + + +@pytest.fixture +def test_audio_bytes() -> bytes: + """Load test audio bytes.""" + if not TEST_AUDIO_PATH.exists(): + pytest.skip("sample_audio.wav fixture not found") + return TEST_AUDIO_PATH.read_bytes() + + # Minimal PDF for testing (real PDF structure) MINIMAL_PDF = b"""%PDF-1.4 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj @@ -226,6 +252,42 @@ class TestGeminiMultimodalIntegration: assert isinstance(response, str) assert len(response) > 0 + @pytest.mark.vcr() + def test_analyze_video_file(self, test_video_bytes: bytes) -> None: + """Test Gemini can analyze a video file.""" + llm = LLM(model="gemini/gemini-2.0-flash") + files = {"video": VideoFile(source=test_video_bytes)} + + messages = _build_multimodal_message( + llm, + "Describe what you see in this video in one sentence. Be brief.", + files, + ) + + response = llm.call(messages) + + assert response + assert isinstance(response, str) + assert len(response) > 0 + + @pytest.mark.vcr() + def test_analyze_audio_file(self, test_audio_bytes: bytes) -> None: + """Test Gemini can analyze an audio file.""" + llm = LLM(model="gemini/gemini-2.0-flash") + files = {"audio": AudioFile(source=test_audio_bytes)} + + messages = _build_multimodal_message( + llm, + "Describe what you hear in this audio in one sentence. Be brief.", + files, + ) + + response = llm.call(messages) + + assert response + assert isinstance(response, str) + assert len(response) > 0 + class TestLiteLLMMultimodalIntegration: """Integration tests for LiteLLM wrapper multimodal with real API calls."""