我給Alibaba JManus提交的第一個PR被Merge了!
前幾天給JManus提交了一個PR,就在剛剛被接受了,這篇文章分享一下這個PR修改的是什么。
圖片
這個PR修改的是#2170這個bug,這個bug是這樣的:
圖片
意思是,playwright在下載瀏覽器時會直接下載3個瀏覽器,chrome、firefox、webkit。
playwright是一個自動化測試框架,可以通過代碼(java、python、nodejs)來自動操作瀏覽器,你可以用它來做自動化測試、爬數據、RPA等。
而JManus,是一個AI Agent,所以提供了一個操作瀏覽器的工具,從而可以在解決用戶問題時,通過自動操作瀏覽器來完成任務,比如通過瀏覽器打開百度,進行搜索,得到實時數據,而這個工具底層就是用的playwright。
但是,目前的問題是,在第一次使用playwright時,playwright需要下載瀏覽器,默認會下載3個,但是對于JManus而言,其實只需要一個就可以了,比如只需要chrome。
看到這,你可能會覺得,這個bug容易啊,講道理,playwright這么成熟了,應該支持下載特定的瀏覽器了,如果這個bug非常容易,那么應該早就改了,但是實際這個bug是8月19號提出來的,已經有一個多月,如果我不改,可能還要等段時間才會被人改掉,所以它并沒有想象中的那么容易。
圖片
當我們通過Java來使用playwright時,代碼是這樣的:
圖片
其中Playwright.create()就會下載3三個瀏覽器,然后你可以指定啟動哪個瀏覽器,比如上面代碼表示啟動的是chrome瀏覽器,關鍵是,在這個create()方法中,并不支持指定下載某個特定的瀏覽器。
在playwright的官網中,確實也支持下載指定瀏覽器,但是,得通過mvn命令的方式:
圖片
運行以上命令,playwright就只會下載webkit瀏覽器。
但是,在JManus中,我們不可能要求使用者先單獨執(zhí)行一下這行命令,這樣體驗太不好了。
為了解決這個bug,我往下看了playwright的Java源碼,發(fā)現源碼底層的核心是一個叫做DriverJar的類,這個類中的installBrowsers()方法就是負責下載瀏覽器的,而它下載瀏覽器的核心代碼為:
圖片
其實就是開啟一個進程,運行命令,進行瀏覽器的下載,因此要修改這個bug,其實只需要在"install"后面去指定特定的瀏覽器就可以了,比如"install chromium"。
思路是這個思路,關鍵是怎么改呢,看上面這個代碼,人家也沒有提供機制讓你能在"install"后面添加其他的參數。
卡住了,這個bug,本質上需要playwright來優(yōu)化,文章寫完,我試著再去給playwright提交一個PR,讓他直接支持install特定的瀏覽器。
想要看后續(xù)或更多精彩文章,記得點贊+關注,謝謝。
那既然DriverJar本身沒有擴展點,那就再看看源碼,是不是有其他突破口,最后發(fā)現,DriverJar這個類的實例對象創(chuàng)建時,有一個擴展點:
圖片
代碼還是很明顯了,會從環(huán)境變量中讀playwright.driver.impl配置,value是一個類名,如果沒有配,默認就是DriverJar,然后創(chuàng)建對應的實例對象。
既然DriverJar改不了,那我就把它換了,因此我自己定義了一個ManusDriverJar,這個類繼承了DriverJar,核心就是修改了installBrowsers()方法,現在這個方法是我自己定義的了,因此我想怎么改就怎么改了,第一步讀取配置
圖片
然后最重要的就是在"install"后面增加參數:
圖片
這樣,我們就可以通過配置來指定只下載某一個瀏覽器了,而不是下載3個。
最后,要使得我自己定義的ManusDriverJar生效,會在一些需要下載瀏覽器的地方,加上以下代碼:
圖片
以上,就是這個PR的核心內容,官方也沒有討論,直接就合并了,因此這種方式應該也是目前最合適的修改方式了,對應的github鏈接:https://github.com/alibaba/spring-ai-alibaba/pull/2459























