From 29f70146d25435e098fb99b9539d958c3e6b84d7 Mon Sep 17 00:00:00 2001 From: geoffsee <> Date: Tue, 27 May 2025 19:10:33 -0400 Subject: [PATCH] **Add new test script, agent modifications, and SearXNG integration updates** --- .env | 10 +- .env.cerebras | 4 - .env.fireworks | 4 - .env.google | 4 - .env.groq | 4 - .env.openai | 4 - .gitignore | 5 +- Cargo.lock | 4 +- Cargo.toml | 2 +- README.md | 36 + bun.lockb | Bin 562032 -> 504218 bytes compose.yml | 6 + package.json | 12 +- packages/genaiscript-rust-shim/package.json | 2 +- searxng/.gitignore | 1 + searxng/README.md | 7 + searxng/auth-file | 1 + searxng/create_auth_file.sh | 4 + searxng/searxng.Dockerfile | 15 + searxng/settings.yml | 2350 +++++++++++++++++++ searxng/uwsgi.ini | 53 + src/agents/search.rs | 1 - src/handlers/agents.rs | 4 +- test-search.ts | 43 + 24 files changed, 2538 insertions(+), 38 deletions(-) delete mode 100644 .env.cerebras delete mode 100644 .env.fireworks delete mode 100644 .env.google delete mode 100644 .env.groq delete mode 100644 .env.openai create mode 100644 searxng/.gitignore create mode 100644 searxng/README.md create mode 100644 searxng/auth-file create mode 100644 searxng/create_auth_file.sh create mode 100644 searxng/searxng.Dockerfile create mode 100644 searxng/settings.yml create mode 100644 searxng/uwsgi.ini create mode 100755 test-search.ts diff --git a/.env b/.env index 61982a6..5868b8b 100644 --- a/.env +++ b/.env @@ -1,6 +1,6 @@ -OPENAI_API_KEY="" +OPENAI_API_KEY="your-key-goes-here" OPENAI_API_BASE="https://api.openai.com/v1" -GENAISCRIPT_MODEL_LARGE="" -GENAISCRIPT_MODEL_SMALL="" -SEARXNG_API_BASE_URL="" -SEARXNG_PASSWORD= \ No newline at end of file +GENAISCRIPT_MODEL_LARGE="gpt-4o-mini-2024-07-18" +GENAISCRIPT_MODEL_SMALL="gpt-4o-mini-2024-07-18" +SEARXNG_API_BASE_URL="http://localhost:8080" +SEARXNG_PASSWORD="777b930e" \ No newline at end of file diff --git a/.env.cerebras b/.env.cerebras deleted file mode 100644 index 706505e..0000000 --- a/.env.cerebras +++ /dev/null @@ -1,4 +0,0 @@ -OPENAI_API_KEY="" -OPENAI_API_BASE="https://api.cerebras.ai/v1" -GENAISCRIPT_MODEL_LARGE="" -GENAISCRIPT_MODEL_SMALL="" \ No newline at end of file diff --git a/.env.fireworks b/.env.fireworks deleted file mode 100644 index 7d992a3..0000000 --- a/.env.fireworks +++ /dev/null @@ -1,4 +0,0 @@ -OPENAI_API_KEY="" -OPENAI_API_BASE="https://api.fireworks.ai/inference/v1" -GENAISCRIPT_MODEL_LARGE="" -GENAISCRIPT_MODEL_SMALL="" \ No newline at end of file diff --git a/.env.google b/.env.google deleted file mode 100644 index 72e3eeb..0000000 --- a/.env.google +++ /dev/null @@ -1,4 +0,0 @@ -OPENAI_API_KEY="" -OPENAI_API_BASE="https://generativelanguage.googleapis.com/v1beta/openai" -GENAISCRIPT_MODEL_LARGE="" -GENAISCRIPT_MODEL_SMALL="" diff --git a/.env.groq b/.env.groq deleted file mode 100644 index f7657e5..0000000 --- a/.env.groq +++ /dev/null @@ -1,4 +0,0 @@ -OPENAI_API_KEY="" -OPENAI_API_BASE="https://api.groq.com/openai/v1" -GENAISCRIPT_MODEL_LARGE="" -GENAISCRIPT_MODEL_SMALL="" \ No newline at end of file diff --git a/.env.openai b/.env.openai deleted file mode 100644 index 87c506f..0000000 --- a/.env.openai +++ /dev/null @@ -1,4 +0,0 @@ -OPENAI_API_KEY="" -OPENAI_API_BASE="https://api.openai.com/v1" -GENAISCRIPT_MODEL_LARGE="gpt-4o" -GENAISCRIPT_MODEL_SMALL="gpt-4o-mini" \ No newline at end of file diff --git a/.gitignore b/.gitignore index c19a41f..34cebe8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,8 @@ chrome stream_store data/ -web-agent-rs/ +/open-web-agent-rs/ +/dist/ ./.env* /.genaiscript/ -/packages/genaiscript/node_modules/ +/packages/genaiscript/node_modules/ \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index c82ba1f..2834070 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -514,9 +514,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.166" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2ccc108bbc0b1331bd061864e7cd823c0cab660bbe6970e66e2c0614decde36" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "lock_api" diff --git a/Cargo.toml b/Cargo.toml index 5b28c73..da9f138 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,4 +30,4 @@ sled = "0.34.7" tower-http = { version = "0.6.2", features = ["trace"] } anyhow = "1.0.97" base64 = "0.22.1" -fips204 = "0.4.6" +fips204 = "0.4.6" \ No newline at end of file diff --git a/README.md b/README.md index 677d6d4..3d4372d 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,42 @@ Remote genaiscript host for integration into conversational AI applications. > This application is actively being ported, expect breaking changes. + +## Quickstart +```bash +git clone +bun i +bun run build +bun dev +``` + +```javascript +#!/usr/bin/env node + +(async () => { + const url = "http://localhost:3006" + const createAgentRequestParams = { + + }; + + const createAgentRequest = fetch(url, { + method: "POST", + body: JSON.stringify(createAgentRequestParams) + }); + + const {streamId} = await createAgentRequest.json(); + + + const streamUrl = new URL(url); + streamUrl.pathname = streamId; + const eventsource = new EventSource(streamUrl) + + eventsource.onmessage = (event) => { + console.log(JSON.stringify(event)) + } +}) +``` + ### Disclaimer This has not undergone a formal security assessment. You should do your own evaluation before using this. diff --git a/bun.lockb b/bun.lockb index 515319e3dd376b1e0380775c575104343e80b139..1b99e399a19423a8c5c0064539cb2abea25683bd 100755 GIT binary patch delta 115316 zcmeFacYIXU+V;O^!oX~hqJn~ofLI_BHM9u?M!Fy(MM^-50Rl-#LMlxmsGwLtWQ!Y6 z6!oYW%@I@-3t~e-MX_VSUNDM^9u*7v`(Ask2{}HT^S+3lB z++XYJjAP5kudNj@$0;r;%_=E%oFVWwjx#?$rywUkr=;{scs=;9VaIX7rL`TWC0JUL zmot&LB@|a5UI-owjsly31HcAgD%ce4OJ-qX5+4pGfrpk8SVuq+O-X$uxc3mpIShOP zemwXVT>4Ys5#Zaj<{0o+cnk0lu!-zWGEs6`FEnE2zsiPLA6 zWEDHk6nJyESI;RADk>|>nT#c!Q54vUi0+^&Y6sGp`7cwTGK>dh;_GY$$75QV{%Xds zAy`scTu_$pIMZl#WB5I!Q^PI*WvLi=64)G6`MN zG<+U2S^hj{`eaq({aEkN^7A{HGK;fHi)SMirWBQBm1Q}x&Zf*c7L!4BEx)X!G;>mR z)>V|LI!m(hXUMmQBpE(8X4muI;5c89UUOp?sDXPj-HddifjiLE&>OoM7u*6@LuO~@=P7?x#CX`Z-BoV6 zGyg*Za+Tug6Q`Gw_+=7k6_|OtN!YZ9nbi^SaP)tms{svrnudN1SN^!gQ!KUu)sXW* zEjwp}>c~3E*BrV6Jgl6+8@V3rG7ftasETWyZCd&RToz~!s>eIg)qtF=tgKk4jt<3@PM_Anxq7gd+u+#a zuBJHEmkKI*0y_^ihF%@4jMZ*rnXbDM^{Bv8*-9B>2Zjlkpkm zsRnLJiOG_eSuk}p?DfJ@dgF5Li>ojZ&*4QK<(fcwzp0H1&|>?@#px_F$)w;Pm2 zis+p_nd1$A9#nao!TMl!X36xK^gVL|T&_QpfGQ{eWup5@D6F*j!+EB{X*iPR)}e6Y7_p^ zb=FXk(%q3{^4-q5t@I_BSe=h&o1S+BHH1%F%q^KnzggNzuc5gq2m8xp1zDx}nI+Sl zJvpYptdc_ZvP`Ee*H~i6G*eJkNm*%5UWwDs@;n>=75?PqNT#P?o%i za$A5ysaQOLdDF`$XO_^q{x;%ti^qViNmv(DL5VZQMf6-PFR{o3o>WSYekwFQ9#Lc} zIEHvxb{|~JUXU&&r{p8JobfKwD}H`Cfp!E6Kvgt}Rbh5vmh&@qlu4_=M&K?`&hr`t zC?l!za?sMs4DU^T6`Zith#96KJwc8Asi4X~20R=r&MKLnHzUg_Z#~PHrWvTQst2lq zM`xO$NbDF(*cWBG1)$R9%`pue3^s>n6&JJLXU)ny-{gzi_(m6)^k1Rt7&wdk8gh4T zfNXsvP|th>RWOwV>Uk%6q=uY3&$QT~<;TEVGi5XcOF&sBwufvZ627lEp8VjiugPG@4-lqotr6qe;vrQ=*f0qXgrY}N_% zd*Cv8=^~Rc6Vwp29 zgY%=~tTg$5SYhywhubQ2<)2tSo99kiyvP=inTwnAIrKVH;r>;o$5S#(f+cPq>D0hU zdD9EBNLOn4->x^7ng&;cdaX7?v|16R86mp6F5nw(gkXy^wwm=3=R z)+c_VEiZ8xDJ-5oDXXNU+Gj`G_{7P#psXObj9nnXGfOf9pPqlSX%D+~@$|B(Svdto zWjV!J#b4hNj8ysjv3ApHcB>h>4~WpvKLTn5Ua@@0ZKfkVz((k)pnUil;$_k7+fBz3 z+k6}1)lqxYoDYQuhHMeUvkcU+760%zQ^6+|UjtRq7K^uNh#q&T_)cY>ez)9Je#gns2olD54hTluWU2pplCzrSTyXo?=7JmjcW`~0^0Vk#4 z$!^=-rbN7c^5mT2!ZX&HnlcM!=Vz8q%AQ!9$rw4#59q47+j>*(5>PFgnNv_wI=#T@ zbB`&%3rP9p9FeB-(3bBsL(pb2C5y)5WQX5t#w6inrQ&ec;2PASOD&vFv$ zLDUvJtt?OLnv+$KIWaG5vNLFdX;3K-aw*wavnEZ?n;yj9FVipv>j^ZV;>0HM$HB^) zRmjFw;ykp`%#J%iS!gAwF}ea&{<#(lL3#0HP|i`3RWO+ zV=NwKF}t+1Fok`1a@J%H-HyX(=1rsfEw-5QIEkiA$;+HtJZ17EnI-YwApUf)^Oes( zg@Ek(4XBE`JY#%z2`IZ3W|n5BOv{=*GdpKeHU;FAWX+=cPHUS!an91)w8G4il0UwH zIEr-g$P=G6^)v%ju9>trL}K>-aa~R<-~*mFJxQ$JiCLal=Jte5gWmz=C@+EPNdFg% zz8VZVW_iK_K?m3ys$ZETTH1z$DyT8o82saNaDL`A9y4=z4l!>83JUX?Rh&#-Hbd!x zvgiw-dcOZ9Go({9SroC{+E2yZNXSlSaMfc+VYmLV5l)&3Fx^IU6LN zk`iw_Hqk-3!aZ-84%UCuyfXS`r`d{M1+^dC2et&4gDt?B;IZIvur(M1n}f~4qrl%O zkNEQWcTj;kp0>+at~4vZkQ1A8FI+R@eQzO@&q9;iUTj4ASdqHYLC0HMnMdzbfosbJlIM5s!e(QM&RlnjBp94NpbVBYVh0pmdRY$&KP=20dyFLQF%q`aK69Ma8BO)F4`O3R81CNtw(hC-^Ze7;_v zWRfEB+N%)-G@yXy;ZR_S#8RJl{`=#SpI9i9$XB0ylc$$v70l4OlEoX~>CWa_p`c-9 zJP}Nyo;%?hvfvd!5t$2~a)$yTw%&F9FLH zQEY|r7SFWU*o2p*U0AP1Sj8eXKr&d^pAmZiDJvg zf*OH6$Ap5}$9XkHL)sZ#hT3toNv~J6YQT*xOgYzByaZH5qsXrYH38+j_}7&7q<7)L zF|x2=sto1)N`Xp{TbMO91?6M7dODGR4Qd6~(DUkPYF0{-lUUIkqN~D@ z#~bVi%Ee~o=e1Wwi4iEt#5?g#=T{P_pbnsV*2-o)&Q|oB#dj=j1?5s3K&4*;D*s$i z73bLaJ~qAssP*d`+o9?CQ>W%k;Q*I2WoCIXPh4+VQ^u2xNfQ=ng)hkhC0Tisvx>8_ zg6W)>HGA2~CS4xyvuMAQn7y^owbC~xpDbC&V&cG;IPrfQG7D&NR?*-xeUW<2DW)e2 zK`n4IL5*EWNp|5hDmd&kGZZeU%`R)wBt~drLE;r5Z}fCvbjnZl!pEOjepq|czJ#yl zQk>c|&f?GxCO+}_{4`uUQ{wTNmxFQuXNXOo__m=RTrQgUwxBy)&6$K-=JBLq-(DZ? zWX>$~VO~yY z%B0NuNw0z4+|_v29dPw;c)D?n<#0L3%akvDbhnUmg7$$_0unCkZW7D_rOb`r0Zq*sh~VBPClI(E}s&v{163^eC zAgIE`bNnD0AkX{b7ZY?aNY^^(!GSNz6W`<~zEDqm|DE_|Kk>zT;v0T_4_@As3KHMY z|M83R#24xMrd=jWd_$l3qJ2ICE>kDIkxzVcpH$l%(-L3IC%(`A;COQ^tMM&y`9FP4 zoVb&axOMn zxH^!y7V^jI9*M8||4&y6o*No+Qs~H?U`z0iR}2zPn>f_ivqSm(#33VbT1gxx5~r5L zsV8v=Ic2ihSrUhh#Hl86D$?mj3r*tGlsF|N4ljvAk2$0;{}ZR5#4##yx=9?P5~rfX z@hWjTN}O&kVpY^ic-*yS<)rf9;bWQ}D*3!H&8*0Y18L%$@JG=b^(JFOmLjcyIbbtz z0;mEePEr>y!~nn{s!2(&0_o{ypuY_d70G-RsCE13np9f7$ULz22Zp!C_4X4*2Qk zjO!MS8u4RjSig^sJHFwfQNylxe*608XT3F@+j!Y2E$`jhc}*zV>g`j%?DN*86-Hk_yWj0!T=hXmuVt5wX-nR`qTx@s+!YQt{OYxlPrUo|*3UcMRkrTk zFVCMceP6e-S;M>azVF&59qzcQ;kk!3yLi;9vmPCm^JMt9SC)FayJUD-KX!j+)(Q?e}K2*v{v5Gu71lWy$35Zd)9hy<5wqa_4Y<{KK}BdqaJIy|D{>U z?;m}^V^0-$-*oLCeeA;--B))x`&BP3y-l>))~nrJ3)kK0otNG;x_j;A4PSq~cA+;b zeQUJi&xdRpwS4_}uSd7jnx47g_xIl&`~HZM%liLz->t`A@ad2_NrOhLe84O0)~3-B zza7_i^WCp3IizC8j;^(?&-PYy+tFxC@}TW6zS;KDEd%;o*=Ek;SKXW4Jv-zTwrk_< zh!=WWPi}c{kJB?k-nw>8y%jySdW}wP+Vr>8 zHh8;FX?bs9&;DU=$bhEa#@;P6hRn-*wbj?S(7`KacnuetK)mrFMP z_S&#+?(_Lee!OMyxBb?(8}-&XhgH3?u+iAOyal1_zjirE@2(=sK%K z_`~r-zxt|h^yaT3*T1``jrUFOmR__^c64*gAMX0*($i1#3j6eEbT>JnF;6d z*7aE$-Tcdxhh{u_H>6$5roZMrxqr~PvnDh>X+h?zYuXR#^KIzcPaZ9O z%xgIyExP2Udq(V^`{IauGX^Y;L@)m~wmPZrq{qG8XD^LD|Kx`^ef->AZ{Is>@He%h zvBQqJYR>$r-+Qx$xAYzxp5|X2i}di$8xifRbBLbmf#9V0Qh%3b{8BI*Wv~sWcX;f{pg_ zm!*e$H}a~M$HPxF@{+HOM_O=d=;u}Dq`UJ74NDa4?vS2fkt5jXhACC#Izpp@@?B0$ z2O2W!aIeabyEh@4wx&*txqD&5DWsN{IzHz1Wpx{>BK@M-p|mJ$q^V$WEc|8TpdSM{ zDvSvFv4#+4xh6flw~1G^GVZqJ0C!%ZLE+1e@N!qh!=E4FRji7;!`TKi5^<5cU|HUt z<>~IBoKQNUhrRV9Vs1a!nCet(U_*mczY#hO-StvO#UiJ$j85_@SEWa;CS)4(DWTp$ zv)XbTJlET^EIqP-(6}J<0inTO{+e#JIMAd^au*Yl^=f%VV`7n4U>&{6jPyty9w+*H zDH9ndLYYDKb%Z7ap@y6}rw5^Vghm9RR|uKd_V_Oi!)1E6aGa7L_I^S+3WZy=lp{vw zw^Smv?;}D%1#X{KrZEw3FIHFu>qgTIdmScE3wwJ<$K0mJnbCuhG8?7=Htc>I7vu}~ zXzeB65_kR9#-xE5*$X=(s636++JvC3zY`i4n6sQC`&5P8-w7E{E6R$w6HnyMM4~~F zHL#Mv)Q6u$SNwc0)Gc(9S8;3HJ*kbOufgTeV`A>Ju)=EAwJj!wC3)-Tq(vbb&^lh~ z#F+a8tUoNI;f>Z!HnnMKIL%u#BI@=>=^A8B&4{^I!_Ej&7cGlLzk$hE{!6i1CUv`$ z9jA}t{h|{>X|-T13**xxYlBeA==8|@gc$9S>5<0mXopuhCEe{qNE3k-ffoH8rc#r< zz0|lL*4Z%Dj&3QYH6hJfcLq!;9dG^On7b3E!E!vcw8JTU)dCCqsqL9gFdN5I+W?a} z9Dnaj6K6^(S`~|&a4PkADWlTea|uZgd3(plB0j92`r_^)l!lHmUrUQ(Nj1;$il)XQ z17Shu+;T$3Y!VjM2C0EAXFA(XDh6wS=~8hl{CFp?Vtw5G zhfPvDNYaDU)+u(R)v@G&&ul`GwOQEa#oT%^({xH_+VqB*()Z4cg_p;?+&OV~8)ACU z9GuXtg>_|M)3|N~Plw^47;QnCS8-uH@+e|AZ_kKy_h&*XueQH;EMtiYt7nT_3>!}z z3*6+G`?ih4YBOSy)@17DrHoCF<|sre|AS|ej2AzEauy2yNOO{C83Ttsn0%_Z*l?$0w%8 z+>2r71SwNtwdji4LD%=Ch2mcB195jbTHw2y=HYE|uL^M~2GRt=RZC*-srdciphzY{ zWFCxV2UBe!q^8&L)Qo05O}AMFm=YskS_bO)sf{rsOuYzcX9&O7)2n(g9%+e^?p01s zkDN>B%wXo;N~mv;u;_xATLm+#L+X8L(cY%(s z@#qtX6fi&VBfsT^Ava3Vh|J;j7tkn}+=9`}2?+C0J-#v)zPqoNyeS^u)7Q)06nDF` zwBG2~ok{^wS>zv``J{ou9w3cY4JTDeq22;KRj{G``s$_wg5(_uz z@8xceyQ8p^y5f54DL!d{8BMc^_k^jypfdMT*bu`Q={IbgS=X8~5;8cm0`q5CX5uPg zwiJ2_VZG9Fh%>fhVjBlvPm#GW#jzaX3|j_z$xkr1aT$4Au%f$#Fw+H`!Ceb8#?ZX~ z5T(Cjw6V_GBYvdC`J^aeEL*42y@6;tT`YoS!qX=f4v0V6}bG+QG@o;#!R{=~I?o|Od z4EK_^#lt&?d$~aG5nctbdW2U6d_2NSem3r&IMU4TsJDJ>%pD1n{f%obg&A95H}|RP zlzZpI-1?(ToH<_fgef0gBjx!p`A*Q$$dj<{TKFS6<)wL*W7ETF8D7Qn@yI*`PG--i zyN?r^NS1nDYGy1vY_wN3G9F$u+Djf44?hOLYLD@9N5S>1v&Z+Pz{ zuj1l(wEtw&&jTyYGOJKnW-Rg!tdEz!Ej@g4mRB)4?&|9ojXbjl7k>gKGnviikSSjB z%kl7#DPAsc*%Yq=cy@|c^>W-DGu4>BwiYsXBTV_C!P*nfPCT8hXU{nkCa*WU_2n>) zA8Q?}#}3O_ZbmZQauWUC3+o2cn#JYZ5f?(Rm=idZjL16vn(6{F(r=mL|+7~Qih zFi?1VfmgLN9!Z(5Ik@M+^hhqDei|}&okEnA6rA>cnC?})8F!y9bes-|hw11Ri4@6+ zbp#$yNUmrOCo5pxy~;P!-G;^0&w(r-x-q3xjlA{iWA2Tx0kB{`xw~O%Iu6V7(YnNO zW*UacSHakT<)URA$V!c|Ov8GXdb#h!-HQ=9MQ9Cw5YK|ig3RIzVv%29raAq}%_YFV7_K0}CUDt~0LX?uQRiPH+52eXS5?p1NVS1}g82VNOzmfH&fJX%>(CqxgW>f=MjemRTXWExyN2;<}`ykFD+^bo{=4k zJOkq;2HSA`i)fFRG9f)Okx)iZ%Zr4%sg_8+i*3#BKtfve>**1|y%@$pgFeY;Ux2aQ zuy@v5pis&S>EZqhyo%4_?j;C)f`oFjXJH)KwB>Ayxh)pj17`4awiTxJfoC=1qL_z0MY;wAL!Xi^NBXD_I6w-^dW~iQo$rV{48O9cunVtj#7nuZWr`KDNNJU6ncfP``3T$SqR2RVH zZH7GrGn*|V8Vz4*N;%N;Gq3b=zlw(!Ug=eQ6?dN@UhQW`8J|{bF^Pj^CzDWnWb-iX z!MekEZscXcnk8n92v(o)$4k8AZ`e4m@^XRmuktE@XRh+9zKOesEain*b-pav@SrM= zY3@@nmDwSko7MIq`B%PX^I$<;e;YB4cwXtT_ClVK&WSRyW5vCPZ; zF7AGas0=|f-J?A-rs3d0WgzT~M25&RSQj~C^f^L-pHx4^)w{-VdXkbE!E zxce01$UxLEAGO>xm%|w>1187gjL4>SgJouOeQUXw{Czy!&-Ze_kGpUB=4~7Ei$g}2 z6+t7uPY)Nb@REOshwob9<^B+l)Llu#gTqHxLd>y|>ERhGz2qO`;d@qkxj)9;kI~yv zV{niQH(KRYA&y^FJ%D(~QkX0nJd1{3Aj#Ocd;E3AS%VEVS_~UPl4?hBpFoi#;l32{ zGfe%WC$P@fC$@VQiqQ35@=tO19yFz3V`nM(3Z_*H$HET7RvR~D&hV1ue%Oeh zzyOi=VZ3|!GTl95jcE}3&m4}cYrKkI2%=_E$f)6N<%d4Jq>ZZh+U=6w|l_q)lf zK%9rzQSAu&e-BKpq8%(YU&2(%A;EJ&|Cc?=S@+mUd9v#VlV2LAI{8*JSJ@NgCodx0{sMWNa*4bh}>>4#gvPp>hJ|8LWy> zFigSu==im!UiNgJ-loGiG4tl>;k91H7uk+BC5izv~rT4dOZG;V8Q%LyVGh0sI( z`hjdIm41aAIz9S#BT_z_S~09o&@HVP_glvD&A`{Y+ibxwhHC^&1~9YEgQ;CuaYvz9jb?0<%8B+2r!-xFRZe0w%XM)7n{YN}(55rbQuY7q#)0!(Z=J%!s=$ zA!>1D1$==9-D8@^I6uhY5vJw^uMQ%+V9Y$G@Co;tQw8s%w#6bdVeNxA@^=vG>s4l_ zyI&D9i-p>od|%?+xc-`0GzTUN9`NCtP}K3@AQ*n*KELV^2F=}InrrsGQLy%;3Fd)& z8B93>7T&x;UKsra@t+IsaDQT%)Z{3F$rb6&SFy-uSRZc>9+vcg=_V^RQ=#Vrer`jm zzZli7cbvpFKj2qM-M-PRs!ZIKG56>Pjk!4Wj7zHp;hPDLP?dxzn%8N23H7B)ie46r zbbct9H@qL7MMyJ~bH%f<$b+y{uX0Cvq>2!S{n6=e^24T4!K?a6HVpqG=bCC=&Q%37 zUDA*yKjQJM?oNCpu_%!wvJ7S(YIhI{=0&9LCJm(;*n^PFN&~S;G3+#dPZuVGLdI4s zWiP`5rw{zQ?xWT2M-%$MOcOZyMHj&2e$|5;*{Jy7z2`ncanorU+j+BJbp#eI+ic2a zC|R5IYvb%zDD?`m74%cmbxlQp+!Dz^e14>7$v$!z>H=MVIjf z28@-eGTq%lNFKui!popTp7L{#W;Gh{6sospPP)60kZfb#raovHE>IP7_rNp`ER3vB zDO*hK=G{gSOx9;zz}|Pj?8xvP&gZaH;_B+-i$!SrDb|Y2-oc|Y?3`*s& z{?8=#0u^~3tXGgyY!^(`u`07Sow~Jp-i>5`IlyMb!roRtw>e$>5;fh=KRT4|p0v$m zrW*P&0j8k}UJXQ6!ukbk`g>MS@{5iRaol*;)Xy05DrXi^Pu!QlmW2_dz@6ut!}r>*|}B=WuDgB7jqYvz?~Fb5-)b$CzLh!3-1Z^%lo_6TF$= zcoTHq=DoTJjwLw71fL*iOE~5oW~fmM37WL-^8|Yb?bX@3_b%fm=39{qVS(KP_kIj^ zV5%PRZq0WlQ(&y`yeV2kNUlYXckrba%ve(6c=&r}oP%RdbPy~~N@Kh8u5+UZry?}a zf|AtXeaAof)KGV~;CSG4*uy;QO8-y#nwt#BW`Zt(O{!*lVVTuz*f-pRsAlW`i8b2G&4}u_eAu}O z7TGEm+!$&7ttM@LSElm$1c#g8iv)+6V5{%wjR_VV2tH2mY@;^(M|E%4>In zK10k>A*5-NND1z+iI1Pqb;nD4+s#tqq_cj+zCEz-vL6#)h!^p4?j@Mqiudlk*?(%E z@qYZ8n-u?mDK6x%KbxWa$uccAkvy^BIJK6L+$PvKB2_TfXr2<={G8~b(occ0!E^k& zi_lp%eOfIDU+i(kqw6nP4U}LGA$cBW@vX6>dwyZM^r79qAfJLqlI$8bsE>2Kgy{IIrv>csdbm z^Y~}G-GFwFe*EBlf3$=^(gOq~Z~;bVXIk~4Xk_`6xh%&dF{rfOLG zIQ`UjLct-wiMM`cS`=d1swsL2OjFyeTpMAh!C3HlYTs>B*75gpyo_?Wu18R$@)g5O z_nE%o+d_VBf6gjzqV_RqIIN!(4h191>NY19nFMRE<7Z?!A-;9O_@59``bh99r)^TA zWwKNzOis&$W%<4l#_MHXi+(^zHPhlvv1pT8p

Ua9DT&#aLLSG>(LVv0%~pEanb? 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 M1!`J&#%$^T0UPrH{{R30 delta 148709 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

o_zd+(_G&+lYDHs- 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 diff --git a/compose.yml b/compose.yml index 682679f..b0b4f76 100644 --- a/compose.yml +++ b/compose.yml @@ -1,4 +1,10 @@ services: + searxng: + build: + context: ./searxng # Path to the directory containing the searxng.Dockerfile + dockerfile: searxng.Dockerfile + ports: + - "8080:8080" # Expose SearxNG on port 8080 agent-server: build: context: . diff --git a/package.json b/package.json index 14dcdbb..c9bb48d 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,21 @@ { "name": "open-web-agent-rs", "type": "module", - "workspaces": ["packages/*"], + "workspaces": [ + "packages/*" + ], "private": true, "scripts": { "dev": "bunx kill-port 3006 && bun run build && cargo watch -x 'run src/main.rs'", "start": "docker compose up --build", "ai:search": "genaiscript run packages/genaiscript/genaisrc/web-search.genai.mts --vars USER_INPUT='who won the 2024 election?'", - "shim:ai:search": "pnpm build && ./dist/shim.js --file=genaisrc/search.genai.mts USER_INPUT=\"Who won the 2024 presidential election?\"\n", + "shim:ai:search": "pnpm build && ./packages/genaiscript-rust-shim/dist/genaiscript-rust-shim.js --file=packages/genaiscript/genaisrc/web-search.genai.mts USER_INPUT=\"Who won the 2024 presidential election?\"\n", "ai:news": "genaiscript run packages/genaiscript/genaisrc/news-search.genai.mts --vars USER_INPUT='What are the latest updates and developments in the Ukraine war?'", "ai:url:read": "genaiscript run packages/genaiscript/genaisrc/web-scrape.genai.mts --vars USER_INPUT='{\"url\":\"https://geoff.seemueller.io/about\",\"query\":\"Describe the details of the page.\", \"action\": \"read\"}'", "ai:url:scrape": "npx genaiscript run packages/genaiscript/genaisrc/web-scrape.genai.mts --vars USER_INPUT='{\"url\":\"https://www.time4learning.com/homeschool-curriculum/high-school/eleventh-grade/math.html\",\"query\":\"What is on this page?\", \"action\": \"scrape\"}'", "prod:logs": "fly logs", - "build": "(cd packages/genaiscript-rust-shim && bun run buildShim)" - } + "test-http": "./test-search.ts", + "build": "(cd packages/genaiscript-rust-shim && bun run buildShim && bun run setupDev && cargo build)" + }, + "packageManager": "pnpm@10.7.1+sha512.2d92c86b7928dc8284f53494fb4201f983da65f0fb4f0d40baafa5cf628fa31dae3e5968f12466f17df7e97310e30f343a648baea1b9b350685dafafffdf5808" } diff --git a/packages/genaiscript-rust-shim/package.json b/packages/genaiscript-rust-shim/package.json index 407c085..306284a 100644 --- a/packages/genaiscript-rust-shim/package.json +++ b/packages/genaiscript-rust-shim/package.json @@ -5,7 +5,7 @@ "type": "module", "scripts": { "buildShim": "esbuild genaiscript-rust-shim.ts --bundle --format=esm --packages=external --outdir=dist --platform=node && chmod +x dist/genaiscript-rust-shim.js", - "setupDev": "cp dist/genaiscript-rust-shim.js ../../dist/genaiscript-rust-shim.js" + "setupDev": "cp -R ./dist ../../" }, "devDependencies": { "@types/bun": "latest", diff --git a/searxng/.gitignore b/searxng/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/searxng/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file diff --git a/searxng/README.md b/searxng/README.md new file mode 100644 index 0000000..98e83d5 --- /dev/null +++ b/searxng/README.md @@ -0,0 +1,7 @@ +# SearXNG +SearXNG is a free internet metasearch engine which aggregates results from up to 246 search services. + +[See Documentation](https://docs.searxng.org) + +**Default credentials:** +admin:777b930e \ No newline at end of file diff --git a/searxng/auth-file b/searxng/auth-file new file mode 100644 index 0000000..89b0b67 --- /dev/null +++ b/searxng/auth-file @@ -0,0 +1 @@ +admin:XRo6tXfiAEXFk diff --git a/searxng/create_auth_file.sh b/searxng/create_auth_file.sh new file mode 100644 index 0000000..ff888d1 --- /dev/null +++ b/searxng/create_auth_file.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +# will prompt for a new password, default is 777b930e +htpasswd -d ./auth-file admin \ No newline at end of file diff --git a/searxng/searxng.Dockerfile b/searxng/searxng.Dockerfile new file mode 100644 index 0000000..2cf675b --- /dev/null +++ b/searxng/searxng.Dockerfile @@ -0,0 +1,15 @@ +FROM searxng/searxng:2025.3.31-08885d061 + +RUN mkdir -p /etc/searxng + +RUN apk upgrade && apk add uwsgi-router_basicauth + +COPY settings.yml /etc/searxng/settings.yml +COPY uwsgi.ini /etc/searxng/uwsgi.ini +COPY auth-file /etc/searxng/auth-file + +ENV INSTANCE_NAME=searxng \ + SEARXNG_SETTINGS_PATH=/etc/searxng/settings.yml \ + UWSGI_SETTINGS_PATH=/etc/searxng/uwsgi.ini + +CMD ["python3", "-m", "searxng"] diff --git a/searxng/settings.yml b/searxng/settings.yml new file mode 100644 index 0000000..1035159 --- /dev/null +++ b/searxng/settings.yml @@ -0,0 +1,2350 @@ +general: + # Debug mode, only for development. Is overwritten by ${SEARXNG_DEBUG} + debug: false + # displayed name + instance_name: "searxng" + # For example: https://example.com/privacy + privacypolicy_url: false + # use true to use your own donation page written in searx/info/en/donate.md + # use false to disable the donation link + donation_url: false + # mailto:contact@example.com + contact_url: false + # record stats + enable_metrics: true + +brand: + new_issue_url: https://github.com/searxng/searxng/issues/new + docs_url: https://docs.searxng.org/ + public_instances: https://searx.space + wiki_url: https://github.com/searxng/searxng/wiki + issue_url: https://github.com/searxng/searxng/issues + # custom: + # maintainer: "Jon Doe" + # # Custom entries in the footer: [title]: [link] + # links: + # Uptime: https://uptime.searxng.org/history/darmarit-org + # About: "https://searxng.org" + +search: + # Filter results. 0: None, 1: Moderate, 2: Strict + safe_search: 0 + # Existing autocomplete backends: "dbpedia", "duckduckgo", "google", "yandex", "mwmbl", + # "seznam", "startpage", "stract", "swisscows", "qwant", "wikipedia" - leave blank to turn it off + # by default. + autocomplete: "" + # minimun characters to type before autocompleter starts + autocomplete_min: 4 + # Default search language - leave blank to detect from browser information or + # use codes from 'languages.py' + default_lang: "auto" + # max_page: 0 # if engine supports paging, 0 means unlimited numbers of pages + # Available languages + # languages: + # - all + # - en + # - en-US + # - de + # - it-IT + # - fr + # - fr-BE + # ban time in seconds after engine errors + ban_time_on_fail: 5 + # max ban time in seconds after engine errors + max_ban_time_on_fail: 120 + suspended_times: + # Engine suspension time after error (in seconds; set to 0 to disable) + # For error "Access denied" and "HTTP error [402, 403]" + SearxEngineAccessDenied: 86400 + # For error "CAPTCHA" + SearxEngineCaptcha: 86400 + # For error "Too many request" and "HTTP error 429" + SearxEngineTooManyRequests: 3600 + # Cloudflare CAPTCHA + cf_SearxEngineCaptcha: 1296000 + cf_SearxEngineAccessDenied: 86400 + # ReCAPTCHA + recaptcha_SearxEngineCaptcha: 604800 + + # remove format to deny access, use lower case. + # formats: [html, csv, json, rss] + formats: + - html + - json + +server: + # Is overwritten by ${SEARXNG_PORT} and ${SEARXNG_BIND_ADDRESS} + port: 8888 + bind_address: "127.0.0.1" + # public URL of the instance, to ensure correct inbound links. Is overwritten + # by ${SEARXNG_URL}. + base_url: / # "http://example.com/location" + limiter: false # rate limit the number of request on the instance, block some bots + public_instance: false # enable features designed only for public instances + + # If your instance owns a /etc/searxng/settings.yml file, then set the following + # values there. + # development configuration only! + secret_key: "b02c3bdcc9bd04a8d13b4e191bd745566ee021c27c24cf5078f73d4dfe945504" # Is overwritten by ${SEARXNG_SECRET} + # Proxying image results through searx + image_proxy: false + # 1.0 and 1.1 are supported + http_protocol_version: "1.0" + # POST queries are more secure as they don't show up in history but may cause + # problems when using Firefox containers + method: "POST" + default_http_headers: + X-Content-Type-Options: nosniff + X-Download-Options: noopen + X-Robots-Tag: noindex, nofollow + Referrer-Policy: no-referrer + +redis: + # URL to connect redis database. Is overwritten by ${SEARXNG_REDIS_URL}. + # https://docs.searxng.org/admin/settings/settings_redis.html#settings-redis + url: false + +ui: + # Custom static path - leave it blank if you didn't change + static_path: "" + static_use_hash: false + # Custom templates path - leave it blank if you didn't change + templates_path: "" + # query_in_title: When true, the result page's titles contains the query + # it decreases the privacy, since the browser can records the page titles. + query_in_title: false + # infinite_scroll: When true, automatically loads the next page when scrolling to bottom of the current page. + infinite_scroll: false + # ui theme + default_theme: simple + # center the results ? + center_alignment: false + # URL prefix of the internet archive, don't forget trailing slash (if needed). + # cache_url: "https://webcache.googleusercontent.com/search?q=cache:" + # Default interface locale - leave blank to detect from browser information or + # use codes from the 'locales' config section + default_locale: "" + # Open result links in a new tab by default + # results_on_new_tab: false + theme_args: + # style of simple theme: auto, light, dark + simple_style: auto + # Perform search immediately if a category selected. + # Disable to select multiple categories at once and start the search manually. + search_on_category_select: true + # Hotkeys: default or vim + hotkeys: default + +# Lock arbitrary settings on the preferences page. To find the ID of the user +# setting you want to lock, check the ID of the form on the page "preferences". +# + +# searx supports result proxification using an external service: +# https://github.com/asciimoo/morty uncomment below section if you have running +# morty proxy the key is base64 encoded (keep the !!binary notation) +# Note: since commit af77ec3, morty accepts a base64 encoded key. +# +# result_proxy: +# url: http://127.0.0.1:3000/ +# # the key is a base64 encoded string, the YAML !!binary prefix is optional +# key: !!binary "your_morty_proxy_key" +# # [true|false] enable the "proxy" button next to each result +# proxify_results: true + +# communication with search engines +# +outgoing: + # default timeout in seconds, can be override by engine + request_timeout: 3.0 + # the maximum timeout in seconds + # max_request_timeout: 10.0 + # suffix of searx_useragent, could contain information like an email address + # to the administrator + useragent_suffix: "" + # The maximum number of concurrent connections that may be established. + pool_connections: 100 + # Allow the connection pool to maintain keep-alive connections below this + # point. + pool_maxsize: 20 + # See https://www.python-httpx.org/http2/ + enable_http2: true + # uncomment below section if you want to use a custom server certificate + # see https://www.python-httpx.org/advanced/#changing-the-verification-defaults + # and https://www.python-httpx.org/compatibility/#ssl-configuration + # verify: ~/.mitmproxy/mitmproxy-ca-cert.cer + # + # uncomment below section if you want to use a proxyq see: SOCKS proxies + # https://2.python-requests.org/en/latest/user/advanced/#proxies + # are also supported: see + # https://2.python-requests.org/en/latest/user/advanced/#socks + # + # proxies: + # all://: + # - http://proxy1:8080 + # - http://proxy2:8080 + # + # using_tor_proxy: true + # + # Extra seconds to add in order to account for the time taken by the proxy + # + # extra_proxy_timeout: 10.0 + # + # uncomment below section only if you have more than one network interface + # which can be the source of outgoing search requests + # + # source_ips: + # - 1.1.1.1 + # - 1.1.1.2 + # - fe80::/126 + +# External plugin configuration, for more details see +# https://docs.searxng.org/dev/plugins.html +# +# plugins: +# - plugin1 +# - plugin2 +# - ... + +# Comment or un-comment plugin to activate / deactivate by default. +# +# enabled_plugins: +# # these plugins are enabled if nothing is configured .. +# - 'Hash plugin' +# - 'Self Information' +# - 'Tracker URL remover' +# - 'Ahmia blacklist' # activation depends on outgoing.using_tor_proxy +# # these plugins are disabled if nothing is configured .. +# - 'Hostname replace' # see hostname_replace configuration below +# - 'Open Access DOI rewrite' +# - 'Tor check plugin' +# # Read the docs before activate: auto-detection of the language could be +# # detrimental to users expectations / users can activate the plugin in the +# # preferences if they want. +# - 'Autodetect search language' + +# Configuration of the "Hostname replace" plugin: +# +# hostname_replace: +# '(.*\.)?youtube\.com$': 'invidious.example.com' +# '(.*\.)?youtu\.be$': 'invidious.example.com' +# '(.*\.)?youtube-noocookie\.com$': 'yotter.example.com' +# '(.*\.)?reddit\.com$': 'teddit.example.com' +# '(.*\.)?redd\.it$': 'teddit.example.com' +# '(www\.)?twitter\.com$': 'nitter.example.com' +# # to remove matching host names from result list, set value to false +# 'spam\.example\.com': false + +checker: + # disable checker when in debug mode + off_when_debug: true + + # use "scheduling: false" to disable scheduling + # scheduling: interval or int + + # to activate the scheduler: + # * uncomment "scheduling" section + # * add "cache2 = name=searxngcache,items=2000,blocks=2000,blocksize=4096,bitmap=1" + # to your uwsgi.ini + + # scheduling: + # start_after: [300, 1800] # delay to start the first run of the checker + # every: [86400, 90000] # how often the checker runs + + # additional tests: only for the YAML anchors (see the engines section) + # + additional_tests: + rosebud: &test_rosebud + matrix: + query: rosebud + lang: en + result_container: + - not_empty + - ["one_title_contains", "citizen kane"] + test: + - unique_results + + android: &test_android + matrix: + query: ["android"] + lang: ["en", "de", "fr", "zh-CN"] + result_container: + - not_empty + - ["one_title_contains", "google"] + test: + - unique_results + + # tests: only for the YAML anchors (see the engines section) + tests: + infobox: &tests_infobox + infobox: + matrix: + query: ["linux", "new york", "bbc"] + result_container: + - has_infobox + +categories_as_tabs: + general: + images: + videos: + news: + map: + music: + it: + science: + files: + social media: + +engines: + - name: 9gag + engine: 9gag + shortcut: 9g + disabled: true + + - name: annas archive + engine: annas_archive + disabled: true + shortcut: aa + + # - name: annas articles + # engine: annas_archive + # shortcut: aaa + # # https://docs.searxng.org/dev/engines/online/annas_archive.html + # aa_content: 'journal_article' # book_any .. magazine, standards_document + # aa_ext: 'pdf' # pdf, epub, .. + # aa_sort: 'newest' # newest, oldest, largest, smallest + + - name: apk mirror + engine: apkmirror + timeout: 4.0 + shortcut: apkm + disabled: true + + - name: apple app store + engine: apple_app_store + shortcut: aps + disabled: true + + # Requires Tor + - name: ahmia + engine: ahmia + categories: onions + enable_http: true + shortcut: ah + + - name: anaconda + engine: xpath + paging: true + first_page_num: 0 + search_url: https://anaconda.org/search?q={query}&page={pageno} + results_xpath: //tbody/tr + url_xpath: ./td/h5/a[last()]/@href + title_xpath: ./td/h5 + content_xpath: ./td[h5]/text() + categories: it + timeout: 6.0 + shortcut: conda + disabled: true + + - name: arch linux wiki + engine: archlinux + shortcut: al + + - name: artic + engine: artic + shortcut: arc + timeout: 4.0 + + - name: arxiv + engine: arxiv + shortcut: arx + timeout: 4.0 + + - name: ask + engine: ask + shortcut: ask + disabled: true + + # tmp suspended: dh key too small + # - name: base + # engine: base + # shortcut: bs + + - name: bandcamp + engine: bandcamp + shortcut: bc + categories: music + + - name: wikipedia + engine: wikipedia + shortcut: wp + # add "list" to the array to get results in the results list + display_type: ["infobox"] + base_url: "https://{language}.wikipedia.org/" + categories: [general] + + - name: bilibili + engine: bilibili + shortcut: bil + disabled: true + + - name: bing + engine: bing + shortcut: bi + disabled: true + + - name: bing images + engine: bing_images + shortcut: bii + + - name: bing news + engine: bing_news + shortcut: bin + + - name: bing videos + engine: bing_videos + shortcut: biv + + - name: bitbucket + engine: xpath + paging: true + search_url: https://bitbucket.org/repo/all/{pageno}?name={query} + url_xpath: //article[@class="repo-summary"]//a[@class="repo-link"]/@href + title_xpath: //article[@class="repo-summary"]//a[@class="repo-link"] + content_xpath: //article[@class="repo-summary"]/p + categories: [it, repos] + timeout: 4.0 + disabled: true + shortcut: bb + about: + website: https://bitbucket.org/ + wikidata_id: Q2493781 + official_api_documentation: https://developer.atlassian.com/bitbucket + use_official_api: false + require_api_key: false + results: HTML + + - name: bpb + engine: bpb + shortcut: bpb + disabled: true + + - name: btdigg + engine: btdigg + shortcut: bt + disabled: true + + - name: ccc-tv + engine: xpath + paging: false + search_url: https://media.ccc.de/search/?q={query} + url_xpath: //div[@class="caption"]/h3/a/@href + title_xpath: //div[@class="caption"]/h3/a/text() + content_xpath: //div[@class="caption"]/h4/@title + categories: videos + disabled: true + shortcut: c3tv + about: + website: https://media.ccc.de/ + wikidata_id: Q80729951 + official_api_documentation: https://github.com/voc/voctoweb + use_official_api: false + require_api_key: false + results: HTML + # We don't set language: de here because media.ccc.de is not just + # for a German audience. It contains many English videos and many + # German videos have English subtitles. + + - name: openverse + engine: openverse + categories: images + shortcut: opv + + - name: chefkoch + engine: chefkoch + shortcut: chef + # to show premium or plus results too: + # skip_premium: false + + # - name: core.ac.uk + # engine: core + # categories: science + # shortcut: cor + # # get your API key from: https://core.ac.uk/api-keys/register/ + # api_key: 'unset' + + - name: crossref + engine: crossref + shortcut: cr + timeout: 30 + disabled: true + + - name: crowdview + engine: json_engine + shortcut: cv + categories: general + paging: false + search_url: https://crowdview-next-js.onrender.com/api/search-v3?query={query} + results_query: results + url_query: link + title_query: title + content_query: snippet + disabled: true + about: + website: https://crowdview.ai/ + + - name: yep + engine: yep + shortcut: yep + categories: general + search_type: web + disabled: true + + - name: yep images + engine: yep + shortcut: yepi + categories: images + search_type: images + disabled: true + + - name: yep news + engine: yep + shortcut: yepn + categories: news + search_type: news + disabled: true + + - name: curlie + engine: xpath + shortcut: cl + categories: general + disabled: true + paging: true + lang_all: "" + search_url: https://curlie.org/search?q={query}&lang={lang}&start={pageno}&stime=92452189 + page_size: 20 + results_xpath: //div[@id="site-list-content"]/div[@class="site-item"] + url_xpath: ./div[@class="title-and-desc"]/a/@href + title_xpath: ./div[@class="title-and-desc"]/a/div + content_xpath: ./div[@class="title-and-desc"]/div[@class="site-descr"] + about: + website: https://curlie.org/ + wikidata_id: Q60715723 + use_official_api: false + require_api_key: false + results: HTML + + - name: currency + engine: currency_convert + categories: general + shortcut: cc + + - name: bahnhof + engine: json_engine + search_url: https://www.bahnhof.de/api/stations/search/{query} + url_prefix: https://www.bahnhof.de/ + url_query: slug + title_query: name + content_query: state + shortcut: bf + disabled: true + about: + website: https://www.bahn.de + wikidata_id: Q22811603 + use_official_api: false + require_api_key: false + results: JSON + language: de + + - name: deezer + engine: deezer + shortcut: dz + disabled: true + + - name: destatis + engine: destatis + shortcut: destat + disabled: true + + - name: deviantart + engine: deviantart + shortcut: da + timeout: 3.0 + + - name: ddg definitions + engine: duckduckgo_definitions + shortcut: ddd + weight: 2 + disabled: true + tests: *tests_infobox + + # cloudflare protected + # - name: digbt + # engine: digbt + # shortcut: dbt + # timeout: 6.0 + # disabled: true + + - name: docker hub + engine: docker_hub + shortcut: dh + categories: [it, packages] + + - name: erowid + engine: xpath + paging: true + first_page_num: 0 + page_size: 30 + search_url: https://www.erowid.org/search.php?q={query}&s={pageno} + url_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/@href + title_xpath: //dl[@class="results-list"]/dt[@class="result-title"]/a/text() + content_xpath: //dl[@class="results-list"]/dd[@class="result-details"] + categories: [] + shortcut: ew + disabled: true + about: + website: https://www.erowid.org/ + wikidata_id: Q1430691 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + # - name: elasticsearch + # shortcut: es + # engine: elasticsearch + # base_url: http://localhost:9200 + # username: elastic + # password: changeme + # index: my-index + # # available options: match, simple_query_string, term, terms, custom + # query_type: match + # # if query_type is set to custom, provide your query here + # #custom_query_json: {"query":{"match_all": {}}} + # #show_metadata: false + # disabled: true + + - name: wikidata + engine: wikidata + shortcut: wd + timeout: 3.0 + weight: 2 + # add "list" to the array to get results in the results list + display_type: ["infobox"] + tests: *tests_infobox + categories: [general] + + - name: duckduckgo + engine: duckduckgo + shortcut: ddg + + - name: duckduckgo images + engine: duckduckgo_extra + categories: [images, web] + ddg_category: images + shortcut: ddi + disabled: true + + - name: duckduckgo videos + engine: duckduckgo_extra + categories: [videos, web] + ddg_category: videos + shortcut: ddv + disabled: true + + - name: duckduckgo news + engine: duckduckgo_extra + categories: [news, web] + ddg_category: news + shortcut: ddn + disabled: true + + - name: duckduckgo weather + engine: duckduckgo_weather + shortcut: ddw + disabled: true + + - name: apple maps + engine: apple_maps + shortcut: apm + disabled: true + timeout: 5.0 + + - name: emojipedia + engine: emojipedia + timeout: 4.0 + shortcut: em + disabled: true + + - name: tineye + engine: tineye + shortcut: tin + timeout: 9.0 + disabled: true + + - name: etymonline + engine: xpath + paging: true + search_url: https://etymonline.com/search?page={pageno}&q={query} + url_xpath: //a[contains(@class, "word__name--")]/@href + title_xpath: //a[contains(@class, "word__name--")] + content_xpath: //section[contains(@class, "word__defination")] + first_page_num: 1 + shortcut: et + categories: [dictionaries] + about: + website: https://www.etymonline.com/ + wikidata_id: Q1188617 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + # - name: ebay + # engine: ebay + # shortcut: eb + # base_url: 'https://www.ebay.com' + # disabled: true + # timeout: 5 + + - name: 1x + engine: www1x + shortcut: 1x + timeout: 3.0 + disabled: true + + - name: fdroid + engine: fdroid + shortcut: fd + disabled: true + + - name: flickr + categories: images + shortcut: fl + # You can use the engine using the official stable API, but you need an API + # key, see: https://www.flickr.com/services/apps/create/ + # engine: flickr + # api_key: 'apikey' # required! + # Or you can use the html non-stable engine, activated by default + engine: flickr_noapi + + - name: free software directory + engine: mediawiki + shortcut: fsd + categories: [it, software wikis] + base_url: https://directory.fsf.org/ + search_type: title + timeout: 5.0 + disabled: true + about: + website: https://directory.fsf.org/ + wikidata_id: Q2470288 + + # - name: freesound + # engine: freesound + # shortcut: fnd + # disabled: true + # timeout: 15.0 + # API key required, see: https://freesound.org/docs/api/overview.html + # api_key: MyAPIkey + + - name: frinkiac + engine: frinkiac + shortcut: frk + disabled: true + + - name: fyyd + engine: fyyd + shortcut: fy + timeout: 8.0 + disabled: true + + - name: genius + engine: genius + shortcut: gen + + - name: gentoo + engine: gentoo + shortcut: ge + timeout: 10.0 + + - name: gitlab + engine: json_engine + paging: true + search_url: https://gitlab.com/api/v4/projects?search={query}&page={pageno} + url_query: web_url + title_query: name_with_namespace + content_query: description + page_size: 20 + categories: [it, repos] + shortcut: gl + timeout: 10.0 + disabled: true + about: + website: https://about.gitlab.com/ + wikidata_id: Q16639197 + official_api_documentation: https://docs.gitlab.com/ee/api/ + use_official_api: false + require_api_key: false + results: JSON + + - name: github + engine: github + shortcut: gh + + # This a Gitea service. If you would like to use a different instance, + # change codeberg.org to URL of the desired Gitea host. Or you can create a + # new engine by copying this and changing the name, shortcut and search_url. + + - name: codeberg + engine: json_engine + search_url: https://codeberg.org/api/v1/repos/search?q={query}&limit=10 + url_query: html_url + title_query: name + content_query: description + categories: [it, repos] + shortcut: cb + disabled: true + about: + website: https://codeberg.org/ + wikidata_id: + official_api_documentation: https://try.gitea.io/api/swagger + use_official_api: false + require_api_key: false + results: JSON + + - name: goodreads + engine: goodreads + shortcut: good + timeout: 4.0 + disabled: true + + - name: google + engine: google + shortcut: go + # additional_tests: + # android: *test_android + + - name: google images + engine: google_images + shortcut: goi + # additional_tests: + # android: *test_android + # dali: + # matrix: + # query: ['Dali Christ'] + # lang: ['en', 'de', 'fr', 'zh-CN'] + # result_container: + # - ['one_title_contains', 'Salvador'] + + - name: google news + engine: google_news + shortcut: gon + # additional_tests: + # android: *test_android + + - name: google videos + engine: google_videos + shortcut: gov + # additional_tests: + # android: *test_android + + - name: google scholar + engine: google_scholar + shortcut: gos + + - name: google play apps + engine: google_play + categories: [files, apps] + shortcut: gpa + play_categ: apps + disabled: true + + - name: google play movies + engine: google_play + categories: videos + shortcut: gpm + play_categ: movies + disabled: true + + - name: material icons + engine: material_icons + categories: images + shortcut: mi + disabled: true + + - name: gpodder + engine: json_engine + shortcut: gpod + timeout: 4.0 + paging: false + search_url: https://gpodder.net/search.json?q={query} + url_query: url + title_query: title + content_query: description + page_size: 19 + categories: music + disabled: true + about: + website: https://gpodder.net + wikidata_id: Q3093354 + official_api_documentation: https://gpoddernet.readthedocs.io/en/latest/api/ + use_official_api: false + requires_api_key: false + results: JSON + + - name: habrahabr + engine: xpath + paging: true + search_url: https://habr.com/en/search/page{pageno}/?q={query} + results_xpath: //article[contains(@class, "tm-articles-list__item")] + url_xpath: .//a[@class="tm-title__link"]/@href + title_xpath: .//a[@class="tm-title__link"] + content_xpath: .//div[contains(@class, "article-formatted-body")] + categories: it + timeout: 4.0 + disabled: true + shortcut: habr + about: + website: https://habr.com/ + wikidata_id: Q4494434 + official_api_documentation: https://habr.com/en/docs/help/api/ + use_official_api: false + require_api_key: false + results: HTML + + - name: hackernews + engine: hackernews + shortcut: hn + disabled: true + + - name: hoogle + engine: xpath + paging: true + search_url: https://hoogle.haskell.org/?hoogle={query}&start={pageno} + results_xpath: '//div[@class="result"]' + title_xpath: './/div[@class="ans"]//a' + url_xpath: './/div[@class="ans"]//a/@href' + content_xpath: './/div[@class="from"]' + page_size: 20 + categories: [it, packages] + shortcut: ho + about: + website: https://hoogle.haskell.org/ + wikidata_id: Q34010 + official_api_documentation: https://hackage.haskell.org/api + use_official_api: false + require_api_key: false + results: JSON + + - name: imdb + engine: imdb + shortcut: imdb + timeout: 6.0 + disabled: true + + - name: imgur + engine: imgur + shortcut: img + disabled: true + + - name: ina + engine: ina + shortcut: in + timeout: 6.0 + disabled: true + + - name: invidious + engine: invidious + # Instanes will be selected randomly, see https://api.invidious.io/ for + # instances that are stable (good uptime) and close to you. + base_url: + - https://invidious.io.lol + - https://invidious.fdn.fr + - https://yt.artemislena.eu + - https://invidious.tiekoetter.com + - https://invidious.flokinet.to + - https://vid.puffyan.us + - https://invidious.privacydev.net + - https://inv.tux.pizza + shortcut: iv + timeout: 3.0 + disabled: true + + - name: jisho + engine: jisho + shortcut: js + timeout: 3.0 + disabled: true + + - name: kickass + engine: kickass + base_url: + - https://kickasstorrents.to + - https://kickasstorrents.cr + - https://kickasstorrent.cr + - https://kickass.sx + - https://kat.am + shortcut: kc + timeout: 4.0 + + - name: lemmy communities + engine: lemmy + lemmy_type: Communities + shortcut: leco + + - name: lemmy users + engine: lemmy + network: lemmy communities + lemmy_type: Users + shortcut: leus + + - name: lemmy posts + engine: lemmy + network: lemmy communities + lemmy_type: Posts + shortcut: lepo + + - name: lemmy comments + engine: lemmy + network: lemmy communities + lemmy_type: Comments + shortcut: lecom + + - name: library genesis + engine: xpath + # search_url: https://libgen.is/search.php?req={query} + search_url: https://libgen.rs/search.php?req={query} + url_xpath: //a[contains(@href,"book/index.php?md5")]/@href + title_xpath: //a[contains(@href,"book/")]/text()[1] + content_xpath: //td/a[1][contains(@href,"=author")]/text() + categories: files + timeout: 7.0 + disabled: true + shortcut: lg + about: + website: https://libgen.fun/ + wikidata_id: Q22017206 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: z-library + engine: zlibrary + shortcut: zlib + categories: files + timeout: 7.0 + + - name: library of congress + engine: loc + shortcut: loc + categories: images + + - name: lingva + engine: lingva + shortcut: lv + # set lingva instance in url, by default it will use the official instance + # url: https://lingva.thedaviddelta.com + + - name: lobste.rs + engine: xpath + search_url: https://lobste.rs/search?utf8=%E2%9C%93&q={query}&what=stories&order=relevance + results_xpath: //li[contains(@class, "story")] + url_xpath: .//a[@class="u-url"]/@href + title_xpath: .//a[@class="u-url"] + content_xpath: .//a[@class="domain"] + categories: it + shortcut: lo + timeout: 5.0 + disabled: true + about: + website: https://lobste.rs/ + wikidata_id: Q60762874 + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: mastodon users + engine: mastodon + mastodon_type: accounts + base_url: https://mastodon.social + shortcut: mau + + - name: mastodon hashtags + engine: mastodon + mastodon_type: hashtags + base_url: https://mastodon.social + shortcut: mah + + # - name: matrixrooms + # engine: mrs + # # https://docs.searxng.org/dev/engines/online/mrs.html + # # base_url: https://mrs-api-host + # shortcut: mtrx + # disabled: true + + - name: mdn + shortcut: mdn + engine: json_engine + categories: [it] + paging: true + search_url: https://developer.mozilla.org/api/v1/search?q={query}&page={pageno} + results_query: documents + url_query: mdn_url + url_prefix: https://developer.mozilla.org + title_query: title + content_query: summary + about: + website: https://developer.mozilla.org + wikidata_id: Q3273508 + official_api_documentation: null + use_official_api: false + require_api_key: false + results: JSON + + - name: metacpan + engine: metacpan + shortcut: cpan + disabled: true + number_of_results: 20 + + # - name: meilisearch + # engine: meilisearch + # shortcut: mes + # enable_http: true + # base_url: http://localhost:7700 + # index: my-index + + - name: mixcloud + engine: mixcloud + shortcut: mc + + # MongoDB engine + # Required dependency: pymongo + # - name: mymongo + # engine: mongodb + # shortcut: md + # exact_match_only: false + # host: '127.0.0.1' + # port: 27017 + # enable_http: true + # results_per_page: 20 + # database: 'business' + # collection: 'reviews' # name of the db collection + # key: 'name' # key in the collection to search for + + - name: mozhi + engine: mozhi + base_url: + - https://mozhi.aryak.me + - https://translate.bus-hit.me + - https://nyc1.mz.ggtyler.dev + # mozhi_engine: google - see https://mozhi.aryak.me for supported engines + timeout: 4.0 + shortcut: mz + disabled: true + + - name: mwmbl + engine: mwmbl + # api_url: https://api.mwmbl.org + shortcut: mwm + disabled: true + + - name: npm + engine: json_engine + paging: true + first_page_num: 0 + search_url: https://api.npms.io/v2/search?q={query}&size=25&from={pageno} + results_query: results + url_query: package/links/npm + title_query: package/name + content_query: package/description + page_size: 25 + categories: [it, packages] + disabled: true + timeout: 5.0 + shortcut: npm + about: + website: https://npms.io/ + wikidata_id: Q7067518 + official_api_documentation: https://api-docs.npms.io/ + use_official_api: false + require_api_key: false + results: JSON + + - name: nyaa + engine: nyaa + shortcut: nt + disabled: true + + - name: mankier + engine: json_engine + search_url: https://www.mankier.com/api/v2/mans/?q={query} + results_query: results + url_query: url + title_query: name + content_query: description + categories: it + shortcut: man + about: + website: https://www.mankier.com/ + official_api_documentation: https://www.mankier.com/api + use_official_api: true + require_api_key: false + results: JSON + + - name: odysee + engine: odysee + shortcut: od + disabled: true + + - name: openairedatasets + engine: json_engine + paging: true + search_url: https://api.openaire.eu/search/datasets?format=json&page={pageno}&size=10&title={query} + results_query: response/results/result + url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ + title_query: metadata/oaf:entity/oaf:result/title/$ + content_query: metadata/oaf:entity/oaf:result/description/$ + content_html_to_text: true + categories: "science" + shortcut: oad + timeout: 5.0 + about: + website: https://www.openaire.eu/ + wikidata_id: Q25106053 + official_api_documentation: https://api.openaire.eu/ + use_official_api: false + require_api_key: false + results: JSON + + - name: openairepublications + engine: json_engine + paging: true + search_url: https://api.openaire.eu/search/publications?format=json&page={pageno}&size=10&title={query} + results_query: response/results/result + url_query: metadata/oaf:entity/oaf:result/children/instance/webresource/url/$ + title_query: metadata/oaf:entity/oaf:result/title/$ + content_query: metadata/oaf:entity/oaf:result/description/$ + content_html_to_text: true + categories: science + shortcut: oap + timeout: 5.0 + about: + website: https://www.openaire.eu/ + wikidata_id: Q25106053 + official_api_documentation: https://api.openaire.eu/ + use_official_api: false + require_api_key: false + results: JSON + + # - name: opensemanticsearch + # engine: opensemantic + # shortcut: oss + # base_url: 'http://localhost:8983/solr/opensemanticsearch/' + + - name: openstreetmap + engine: openstreetmap + shortcut: osm + + - name: openrepos + engine: xpath + paging: true + search_url: https://openrepos.net/search/node/{query}?page={pageno} + url_xpath: //li[@class="search-result"]//h3[@class="title"]/a/@href + title_xpath: //li[@class="search-result"]//h3[@class="title"]/a + content_xpath: //li[@class="search-result"]//div[@class="search-snippet-info"]//p[@class="search-snippet"] + categories: files + timeout: 4.0 + disabled: true + shortcut: or + about: + website: https://openrepos.net/ + wikidata_id: + official_api_documentation: + use_official_api: false + require_api_key: false + results: HTML + + - name: packagist + engine: json_engine + paging: true + search_url: https://packagist.org/search.json?q={query}&page={pageno} + results_query: results + url_query: url + title_query: name + content_query: description + categories: [it, packages] + disabled: true + timeout: 5.0 + shortcut: pack + about: + website: https://packagist.org + wikidata_id: Q108311377 + official_api_documentation: https://packagist.org/apidoc + use_official_api: true + require_api_key: false + results: JSON + + - name: pdbe + engine: pdbe + shortcut: pdb + # Hide obsolete PDB entries. Default is not to hide obsolete structures + # hide_obsolete: false + + - name: photon + engine: photon + shortcut: ph + + - name: pinterest + engine: pinterest + shortcut: pin + + - name: piped + engine: piped + shortcut: ppd + categories: videos + piped_filter: videos + timeout: 3.0 + + # URL to use as link and for embeds + frontend_url: https://srv.piped.video + # Instance will be selected randomly, for more see https://piped-instances.kavin.rocks/ + backend_url: + - https://pipedapi.kavin.rocks + - https://pipedapi-libre.kavin.rocks + - https://pipedapi.adminforge.de + + - name: piped.music + engine: piped + network: piped + shortcut: ppdm + categories: music + piped_filter: music_songs + timeout: 3.0 + + - name: piratebay + engine: piratebay + shortcut: tpb + # You may need to change this URL to a proxy if piratebay is blocked in your + # country + url: https://thepiratebay.org/ + timeout: 3.0 + + - name: podcastindex + engine: podcastindex + shortcut: podcast + + # Required dependency: psychopg2 + # - name: postgresql + # engine: postgresql + # database: postgres + # username: postgres + # password: postgres + # limit: 10 + # query_str: 'SELECT * from my_table WHERE my_column = %(query)s' + # shortcut : psql + + - name: presearch + engine: presearch + search_type: search + categories: [general, web] + shortcut: ps + timeout: 4.0 + disabled: true + + - name: presearch images + engine: presearch + network: presearch + search_type: images + categories: [images, web] + timeout: 4.0 + shortcut: psimg + disabled: true + + - name: presearch videos + engine: presearch + network: presearch + search_type: videos + categories: [general, web] + timeout: 4.0 + shortcut: psvid + disabled: true + + - name: presearch news + engine: presearch + network: presearch + search_type: news + categories: [news, web] + timeout: 4.0 + shortcut: psnews + disabled: true + + - name: pub.dev + engine: xpath + shortcut: pd + search_url: https://pub.dev/packages?q={query}&page={pageno} + paging: true + results_xpath: //div[contains(@class,"packages-item")] + url_xpath: ./div/h3/a/@href + title_xpath: ./div/h3/a + content_xpath: ./div/div/div[contains(@class,"packages-description")]/span + categories: [packages, it] + timeout: 3.0 + disabled: true + first_page_num: 1 + about: + website: https://pub.dev/ + official_api_documentation: https://pub.dev/help/api + use_official_api: false + require_api_key: false + results: HTML + + - name: pubmed + engine: pubmed + shortcut: pub + timeout: 3.0 + + - name: pypi + shortcut: pypi + engine: xpath + paging: true + search_url: https://pypi.org/search/?q={query}&page={pageno} + results_xpath: /html/body/main/div/div/div/form/div/ul/li/a[@class="package-snippet"] + url_xpath: ./@href + title_xpath: ./h3/span[@class="package-snippet__name"] + content_xpath: ./p + suggestion_xpath: /html/body/main/div/div/div/form/div/div[@class="callout-block"]/p/span/a[@class="link"] + first_page_num: 1 + categories: [it, packages] + about: + website: https://pypi.org + wikidata_id: Q2984686 + official_api_documentation: https://warehouse.readthedocs.io/api-reference/index.html + use_official_api: false + require_api_key: false + results: HTML + + - name: qwant + qwant_categ: web + engine: qwant + shortcut: qw + categories: [general, web] + additional_tests: + rosebud: *test_rosebud + + - name: qwant news + qwant_categ: news + engine: qwant + shortcut: qwn + categories: news + network: qwant + + - name: qwant images + qwant_categ: images + engine: qwant + shortcut: qwi + categories: [images, web] + network: qwant + + - name: qwant videos + qwant_categ: videos + engine: qwant + shortcut: qwv + categories: [videos, web] + network: qwant + + # - name: library + # engine: recoll + # shortcut: lib + # base_url: 'https://recoll.example.org/' + # search_dir: '' + # mount_prefix: /export + # dl_prefix: 'https://download.example.org' + # timeout: 30.0 + # categories: files + # disabled: true + + # - name: recoll library reference + # engine: recoll + # base_url: 'https://recoll.example.org/' + # search_dir: reference + # mount_prefix: /export + # dl_prefix: 'https://download.example.org' + # shortcut: libr + # timeout: 30.0 + # categories: files + # disabled: true + + - name: radio browser + engine: radio_browser + shortcut: rb + + - name: reddit + engine: reddit + shortcut: re + page_size: 25 + + - name: rottentomatoes + engine: rottentomatoes + shortcut: rt + disabled: true + + # Required dependency: redis + # - name: myredis + # shortcut : rds + # engine: redis_server + # exact_match_only: false + # host: '127.0.0.1' + # port: 6379 + # enable_http: true + # password: '' + # db: 0 + + # tmp suspended: bad certificate + # - name: scanr structures + # shortcut: scs + # engine: scanr_structures + # disabled: true + + - name: sepiasearch + engine: sepiasearch + shortcut: sep + + - name: soundcloud + engine: soundcloud + shortcut: sc + + - name: stackoverflow + engine: stackexchange + shortcut: st + api_site: "stackoverflow" + categories: [it, q&a] + + - name: askubuntu + engine: stackexchange + shortcut: ubuntu + api_site: "askubuntu" + categories: [it, q&a] + + - name: internetarchivescholar + engine: internet_archive_scholar + shortcut: ias + timeout: 5.0 + + - name: superuser + engine: stackexchange + shortcut: su + api_site: "superuser" + categories: [it, q&a] + + - name: searchcode code + engine: searchcode_code + shortcut: scc + disabled: true + + # - name: searx + # engine: searx_engine + # shortcut: se + # instance_urls : + # - http://127.0.0.1:8888/ + # - ... + # disabled: true + + - name: semantic scholar + engine: semantic_scholar + disabled: true + shortcut: se + + # Spotify needs API credentials + # - name: spotify + # engine: spotify + # shortcut: stf + # api_client_id: ******* + # api_client_secret: ******* + + # - name: solr + # engine: solr + # shortcut: slr + # base_url: http://localhost:8983 + # collection: collection_name + # sort: '' # sorting: asc or desc + # field_list: '' # comma separated list of field names to display on the UI + # default_fields: '' # default field to query + # query_fields: '' # query fields + # enable_http: true + + # - name: springer nature + # engine: springer + # # get your API key from: https://dev.springernature.com/signup + # # working API key, for test & debug: "a69685087d07eca9f13db62f65b8f601" + # api_key: 'unset' + # shortcut: springer + # timeout: 15.0 + + - name: startpage + engine: startpage + shortcut: sp + timeout: 6.0 + disabled: true + additional_tests: + rosebud: *test_rosebud + + - name: tokyotoshokan + engine: tokyotoshokan + shortcut: tt + timeout: 6.0 + disabled: true + + - name: solidtorrents + engine: solidtorrents + shortcut: solid + timeout: 4.0 + base_url: + - https://solidtorrents.to + - https://bitsearch.to + + # For this demo of the sqlite engine download: + # https://liste.mediathekview.de/filmliste-v2.db.bz2 + # and unpack into searx/data/filmliste-v2.db + # Query to test: "!demo concert" + # + # - name: demo + # engine: sqlite + # shortcut: demo + # categories: general + # result_template: default.html + # database: searx/data/filmliste-v2.db + # query_str: >- + # SELECT title || ' (' || time(duration, 'unixepoch') || ')' AS title, + # COALESCE( NULLIF(url_video_hd,''), NULLIF(url_video_sd,''), url_video) AS url, + # description AS content + # FROM film + # WHERE title LIKE :wildcard OR description LIKE :wildcard + # ORDER BY duration DESC + + - name: tagesschau + engine: tagesschau + # when set to false, display URLs from Tagesschau, and not the actual source + # (e.g. NDR, WDR, SWR, HR, ...) + use_source_url: true + shortcut: ts + disabled: true + + - name: tmdb + engine: xpath + paging: true + categories: movies + search_url: https://www.themoviedb.org/search?page={pageno}&query={query} + results_xpath: //div[contains(@class,"movie") or contains(@class,"tv")]//div[contains(@class,"card")] + url_xpath: .//div[contains(@class,"poster")]/a/@href + thumbnail_xpath: .//img/@src + title_xpath: .//div[contains(@class,"title")]//h2 + content_xpath: .//div[contains(@class,"overview")] + shortcut: tm + disabled: true + + # Requires Tor + - name: torch + engine: xpath + paging: true + search_url: http://xmh57jrknzkhv6y3ls3ubitzfqnkrwxhopf5aygthi7d6rplyvk3noyd.onion/cgi-bin/omega/omega?P={query}&DEFAULTOP=and + results_xpath: //table//tr + url_xpath: ./td[2]/a + title_xpath: ./td[2]/b + content_xpath: ./td[2]/small + categories: onions + enable_http: true + shortcut: tch + + # torznab engine lets you query any torznab compatible indexer. Using this + # engine in combination with Jackett opens the possibility to query a lot of + # public and private indexers directly from SearXNG. More details at: + # https://docs.searxng.org/dev/engines/online/torznab.html + # + # - name: Torznab EZTV + # engine: torznab + # shortcut: eztv + # base_url: http://localhost:9117/api/v2.0/indexers/eztv/results/torznab + # enable_http: true # if using localhost + # api_key: xxxxxxxxxxxxxxx + # show_magnet_links: true + # show_torrent_files: false + # # https://github.com/Jackett/Jackett/wiki/Jackett-Categories + # torznab_categories: # optional + # - 2000 + # - 5000 + + # tmp suspended - too slow, too many errors + # - name: urbandictionary + # engine : xpath + # search_url : https://www.urbandictionary.com/define.php?term={query} + # url_xpath : //*[@class="word"]/@href + # title_xpath : //*[@class="def-header"] + # content_xpath: //*[@class="meaning"] + # shortcut: ud + + - name: unsplash + engine: unsplash + shortcut: us + + - name: yandex music + engine: yandex_music + shortcut: ydm + disabled: true + # https://yandex.com/support/music/access.html + inactive: true + + - name: yahoo + engine: yahoo + shortcut: yh + disabled: true + + - name: yahoo news + engine: yahoo_news + shortcut: yhn + + - name: youtube + shortcut: yt + # You can use the engine using the official stable API, but you need an API + # key See: https://console.developers.google.com/project + # + # engine: youtube_api + # api_key: 'apikey' # required! + # + # Or you can use the html non-stable engine, activated by default + engine: youtube_noapi + + - name: dailymotion + engine: dailymotion + shortcut: dm + + - name: vimeo + engine: vimeo + shortcut: vm + + - name: wiby + engine: json_engine + paging: true + search_url: https://wiby.me/json/?q={query}&p={pageno} + url_query: URL + title_query: Title + content_query: Snippet + categories: [general, web] + shortcut: wib + disabled: true + about: + website: https://wiby.me/ + + - name: alexandria + engine: json_engine + shortcut: alx + categories: general + paging: true + search_url: https://api.alexandria.org/?a=1&q={query}&p={pageno} + results_query: results + title_query: title + url_query: url + content_query: snippet + timeout: 1.5 + disabled: true + about: + website: https://alexandria.org/ + official_api_documentation: https://github.com/alexandria-org/alexandria-api/raw/master/README.md + use_official_api: true + require_api_key: false + results: JSON + + - name: wikibooks + engine: mediawiki + weight: 0.5 + shortcut: wb + categories: [general, wikimedia] + base_url: "https://{language}.wikibooks.org/" + search_type: text + disabled: true + about: + website: https://www.wikibooks.org/ + wikidata_id: Q367 + + - name: wikinews + engine: mediawiki + shortcut: wn + categories: [news, wikimedia] + base_url: "https://{language}.wikinews.org/" + search_type: text + srsort: create_timestamp_desc + about: + website: https://www.wikinews.org/ + wikidata_id: Q964 + + - name: wikiquote + engine: mediawiki + weight: 0.5 + shortcut: wq + categories: [general, wikimedia] + base_url: "https://{language}.wikiquote.org/" + search_type: text + disabled: true + additional_tests: + rosebud: *test_rosebud + about: + website: https://www.wikiquote.org/ + wikidata_id: Q369 + + - name: wikisource + engine: mediawiki + weight: 0.5 + shortcut: ws + categories: [general, wikimedia] + base_url: "https://{language}.wikisource.org/" + search_type: text + disabled: true + about: + website: https://www.wikisource.org/ + wikidata_id: Q263 + + - name: wikispecies + engine: mediawiki + shortcut: wsp + categories: [general, science, wikimedia] + base_url: "https://species.wikimedia.org/" + search_type: text + disabled: true + about: + website: https://species.wikimedia.org/ + wikidata_id: Q13679 + + - name: wiktionary + engine: mediawiki + shortcut: wt + categories: [dictionaries, wikimedia] + base_url: "https://{language}.wiktionary.org/" + search_type: text + about: + website: https://www.wiktionary.org/ + wikidata_id: Q151 + + - name: wikiversity + engine: mediawiki + weight: 0.5 + shortcut: wv + categories: [general, wikimedia] + base_url: "https://{language}.wikiversity.org/" + search_type: text + disabled: true + about: + website: https://www.wikiversity.org/ + wikidata_id: Q370 + + - name: wikivoyage + engine: mediawiki + weight: 0.5 + shortcut: wy + categories: [general, wikimedia] + base_url: "https://{language}.wikivoyage.org/" + search_type: text + disabled: true + about: + website: https://www.wikivoyage.org/ + wikidata_id: Q373 + + - name: wikicommons.images + engine: wikicommons + shortcut: wc + categories: images + number_of_results: 10 + + - name: wolframalpha + shortcut: wa + # You can use the engine using the official stable API, but you need an API + # key. See: https://products.wolframalpha.com/api/ + # + # engine: wolframalpha_api + # api_key: '' + # + # Or you can use the html non-stable engine, activated by default + engine: wolframalpha_noapi + timeout: 6.0 + categories: general + disabled: false + + - name: dictzone + engine: dictzone + shortcut: dc + + - name: mymemory translated + engine: translated + shortcut: tl + timeout: 5.0 + # You can use without an API key, but you are limited to 1000 words/day + # See: https://mymemory.translated.net/doc/usagelimits.php + # api_key: '' + + # Required dependency: mysql-connector-python + # - name: mysql + # engine: mysql_server + # database: mydatabase + # username: user + # password: pass + # limit: 10 + # query_str: 'SELECT * from mytable WHERE fieldname=%(query)s' + # shortcut: mysql + + - name: 1337x + engine: 1337x + shortcut: 1337x + disabled: true + + - name: duden + engine: duden + shortcut: du + disabled: true + + - name: seznam + shortcut: szn + engine: seznam + disabled: true + + # - name: deepl + # engine: deepl + # shortcut: dpl + # # You can use the engine using the official stable API, but you need an API key + # # See: https://www.deepl.com/pro-api?cta=header-pro-api + # api_key: '' # required! + # timeout: 5.0 + # disabled: true + + - name: mojeek + shortcut: mjk + engine: xpath + paging: true + categories: [general, web] + search_url: https://www.mojeek.com/search?q={query}&s={pageno}&lang={lang}&lb={lang} + results_xpath: //ul[@class="results-standard"]/li/a[@class="ob"] + url_xpath: ./@href + title_xpath: ../h2/a + content_xpath: ..//p[@class="s"] + suggestion_xpath: //div[@class="top-info"]/p[@class="top-info spell"]/em/a + first_page_num: 0 + page_size: 10 + max_page: 100 + disabled: true + about: + website: https://www.mojeek.com/ + wikidata_id: Q60747299 + official_api_documentation: https://www.mojeek.com/services/api.html/ + use_official_api: false + require_api_key: false + results: HTML + + - name: moviepilot + engine: moviepilot + shortcut: mp + disabled: true + + - name: naver + shortcut: nvr + categories: [general, web] + engine: xpath + paging: true + search_url: https://search.naver.com/search.naver?where=webkr&sm=osp_hty&ie=UTF-8&query={query}&start={pageno} + url_xpath: //a[@class="link_tit"]/@href + title_xpath: //a[@class="link_tit"] + content_xpath: //a[@class="total_dsc"]/div + first_page_num: 1 + page_size: 10 + disabled: true + about: + website: https://www.naver.com/ + wikidata_id: Q485639 + official_api_documentation: https://developers.naver.com/docs/nmt/examples/ + use_official_api: false + require_api_key: false + results: HTML + language: ko + + - name: rubygems + shortcut: rbg + engine: xpath + paging: true + search_url: https://rubygems.org/search?page={pageno}&query={query} + results_xpath: /html/body/main/div/a[@class="gems__gem"] + url_xpath: ./@href + title_xpath: ./span/h2 + content_xpath: ./span/p + suggestion_xpath: /html/body/main/div/div[@class="search__suggestions"]/p/a + first_page_num: 1 + categories: [it, packages] + disabled: true + about: + website: https://rubygems.org/ + wikidata_id: Q1853420 + official_api_documentation: https://guides.rubygems.org/rubygems-org-api/ + use_official_api: false + require_api_key: false + results: HTML + + - name: peertube + engine: peertube + shortcut: ptb + paging: true + # alternatives see: https://instances.joinpeertube.org/instances + # base_url: https://tube.4aem.com + categories: videos + disabled: true + timeout: 6.0 + + - name: mediathekviewweb + engine: mediathekviewweb + shortcut: mvw + disabled: true + + - name: yacy + engine: yacy + categories: general + search_type: text + base_url: https://yacy.searchlab.eu + shortcut: ya + disabled: true + # required if you aren't using HTTPS for your local yacy instance + # https://docs.searxng.org/dev/engines/online/yacy.html + # enable_http: true + # timeout: 3.0 + # search_mode: 'global' + + - name: yacy images + engine: yacy + categories: images + search_type: image + base_url: https://yacy.searchlab.eu + shortcut: yai + disabled: true + + - name: rumble + engine: rumble + shortcut: ru + base_url: https://rumble.com/ + paging: true + categories: videos + disabled: true + + - name: livespace + engine: livespace + shortcut: ls + categories: videos + disabled: true + timeout: 5.0 + + - name: wordnik + engine: wordnik + shortcut: def + base_url: https://www.wordnik.com/ + categories: [dictionaries] + timeout: 5.0 + + - name: woxikon.de synonyme + engine: xpath + shortcut: woxi + categories: [dictionaries] + timeout: 5.0 + disabled: true + search_url: https://synonyme.woxikon.de/synonyme/{query}.php + url_xpath: //div[@class="upper-synonyms"]/a/@href + content_xpath: //div[@class="synonyms-list-group"] + title_xpath: //div[@class="upper-synonyms"]/a + no_result_for_http_status: [404] + about: + website: https://www.woxikon.de/ + wikidata_id: # No Wikidata ID + use_official_api: false + require_api_key: false + results: HTML + language: de + + - name: seekr news + engine: seekr + shortcut: senews + categories: news + seekr_category: news + disabled: true + + - name: seekr images + engine: seekr + network: seekr news + shortcut: seimg + categories: images + seekr_category: images + disabled: true + + - name: seekr videos + engine: seekr + network: seekr news + shortcut: sevid + categories: videos + seekr_category: videos + disabled: true + + - name: sjp.pwn + engine: sjp + shortcut: sjp + base_url: https://sjp.pwn.pl/ + timeout: 5.0 + disabled: true + + - name: stract + engine: stract + shortcut: str + disabled: true + + - name: svgrepo + engine: svgrepo + shortcut: svg + timeout: 10.0 + disabled: true + + - name: tootfinder + engine: tootfinder + shortcut: toot + + - name: wallhaven + engine: wallhaven + # api_key: abcdefghijklmnopqrstuvwxyz + shortcut: wh + + # wikimini: online encyclopedia for children + # The fulltext and title parameter is necessary for Wikimini because + # sometimes it will not show the results and redirect instead + - name: wikimini + engine: xpath + shortcut: wkmn + search_url: https://fr.wikimini.org/w/index.php?search={query}&title=Sp%C3%A9cial%3ASearch&fulltext=Search + url_xpath: //li/div[@class="mw-search-result-heading"]/a/@href + title_xpath: //li//div[@class="mw-search-result-heading"]/a + content_xpath: //li/div[@class="searchresult"] + categories: general + disabled: true + about: + website: https://wikimini.org/ + wikidata_id: Q3568032 + use_official_api: false + require_api_key: false + results: HTML + language: fr + + - name: wttr.in + engine: wttr + shortcut: wttr + timeout: 9.0 + + - name: yummly + engine: yummly + shortcut: yum + disabled: true + + - name: brave + engine: brave + shortcut: br + time_range_support: true + paging: true + categories: [general, web] + brave_category: search + # brave_spellcheck: true + + - name: brave.images + engine: brave + network: brave + shortcut: brimg + categories: [images, web] + brave_category: images + + - name: brave.videos + engine: brave + network: brave + shortcut: brvid + categories: [videos, web] + brave_category: videos + + - name: brave.news + engine: brave + network: brave + shortcut: brnews + categories: news + brave_category: news + + # - name: brave.goggles + # engine: brave + # network: brave + # shortcut: brgog + # time_range_support: true + # paging: true + # categories: [general, web] + # brave_category: goggles + # Goggles: # required! This should be a URL ending in .goggle + + - name: lib.rs + shortcut: lrs + engine: xpath + search_url: https://lib.rs/search?q={query} + results_xpath: /html/body/main/div/ol/li/a + url_xpath: ./@href + title_xpath: ./div[@class="h"]/h4 + content_xpath: ./div[@class="h"]/p + categories: [it, packages] + disabled: true + about: + website: https://lib.rs + wikidata_id: Q113486010 + use_official_api: false + require_api_key: false + results: HTML + + - name: sourcehut + shortcut: srht + engine: xpath + paging: true + search_url: https://sr.ht/projects?page={pageno}&search={query} + results_xpath: (//div[@class="event-list"])[1]/div[@class="event"] + url_xpath: ./h4/a[2]/@href + title_xpath: ./h4/a[2] + content_xpath: ./p + first_page_num: 1 + categories: [it, repos] + disabled: true + about: + website: https://sr.ht + wikidata_id: Q78514485 + official_api_documentation: https://man.sr.ht/ + use_official_api: false + require_api_key: false + results: HTML + + - name: goo + shortcut: goo + engine: xpath + paging: true + search_url: https://search.goo.ne.jp/web.jsp?MT={query}&FR={pageno}0 + url_xpath: //div[@class="result"]/p[@class='title fsL1']/a/@href + title_xpath: //div[@class="result"]/p[@class='title fsL1']/a + content_xpath: //p[contains(@class,'url fsM')]/following-sibling::p + first_page_num: 0 + categories: [general, web] + disabled: true + timeout: 4.0 + about: + website: https://search.goo.ne.jp + wikidata_id: Q249044 + use_official_api: false + require_api_key: false + results: HTML + language: ja + + - name: bt4g + engine: bt4g + shortcut: bt4g + + - name: pkg.go.dev + engine: xpath + shortcut: pgo + search_url: https://pkg.go.dev/search?limit=100&m=package&q={query} + results_xpath: /html/body/main/div[contains(@class,"SearchResults")]/div[not(@class)]/div[@class="SearchSnippet"] + url_xpath: ./div[@class="SearchSnippet-headerContainer"]/h2/a/@href + title_xpath: ./div[@class="SearchSnippet-headerContainer"]/h2/a + content_xpath: ./p[@class="SearchSnippet-synopsis"] + categories: [packages, it] + timeout: 3.0 + disabled: true + about: + website: https://pkg.go.dev/ + use_official_api: false + require_api_key: false + results: HTML + +# Doku engine lets you access to any Doku wiki instance: +# A public one or a privete/corporate one. +# - name: ubuntuwiki +# engine: doku +# shortcut: uw +# base_url: 'https://doc.ubuntu-fr.org' + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: git grep +# engine: command +# command: ['git', 'grep', '{{QUERY}}'] +# shortcut: gg +# tokens: [] +# disabled: true +# delimiter: +# chars: ':' +# keys: ['filepath', 'code'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: locate +# engine: command +# command: ['locate', '{{QUERY}}'] +# shortcut: loc +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: find +# engine: command +# command: ['find', '.', '-name', '{{QUERY}}'] +# query_type: path +# shortcut: fnd +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: pattern search in files +# engine: command +# command: ['fgrep', '{{QUERY}}'] +# shortcut: fgr +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +# Be careful when enabling this engine if you are +# running a public instance. Do not expose any sensitive +# information. You can restrict access by configuring a list +# of access tokens under tokens. +# - name: regex search in files +# engine: command +# command: ['grep', '{{QUERY}}'] +# shortcut: gr +# tokens: [] +# disabled: true +# delimiter: +# chars: ' ' +# keys: ['line'] + +doi_resolvers: + oadoi.org: "https://oadoi.org/" + doi.org: "https://doi.org/" + doai.io: "https://dissem.in/" + sci-hub.se: "https://sci-hub.se/" + sci-hub.st: "https://sci-hub.st/" + sci-hub.ru: "https://sci-hub.ru/" + +default_doi_resolver: "oadoi.org" diff --git a/searxng/uwsgi.ini b/searxng/uwsgi.ini new file mode 100644 index 0000000..63d68a2 --- /dev/null +++ b/searxng/uwsgi.ini @@ -0,0 +1,53 @@ +[uwsgi] +# Who will run the code +uid = searxng +gid = searxng + +# Number of workers (usually CPU count) +# default value: %k (= number of CPU core, see Dockerfile) +workers = 1 + +# Number of threads per worker +# default value: 4 (see Dockerfile) +threads = 4 + +chmod-socket = 660 + +# Plugin to use and interpreter config +single-interpreter = true +master = true +plugin = python3 +lazy-apps = true +enable-threads = 4 + +# Module to import +module = searx.webapp + +# Virtualenv and python path +pythonpath = /usr/local/searxng/ +chdir = /usr/local/searxng/searx/ + +# automatically set processes name to something meaningful +auto-procname = true + +# Disable request logging for privacy +disable-logging = true +log-5xx = true + +# Set the max size of a request (request-body excluded) +buffer-size = 8192 + +# No keep alive +# See https://github.com/searx/searx-docker/issues/24 +add-header = Connection: close + +# uwsgi serves the static files +static-map = /static=/usr/local/searxng/searx/static +# expires set to one day +static-expires = /* 86400 +static-gzip-all = True +offload-threads = 1 + +# Basic auth +plugins = router_basicauth +route = .* basicauth:Searxng Console,auth-file \ No newline at end of file diff --git a/src/agents/search.rs b/src/agents/search.rs index ab45d13..da2af98 100644 --- a/src/agents/search.rs +++ b/src/agents/search.rs @@ -1,6 +1,5 @@ use tokio::process::Child; use tracing; - use crate::utils::utils::run_agent; pub async fn agent(stream_id: &str, input: &str) -> Result { diff --git a/src/handlers/agents.rs b/src/handlers/agents.rs index 913e92a..2cb6554 100644 --- a/src/handlers/agents.rs +++ b/src/handlers/agents.rs @@ -86,7 +86,7 @@ pub async fn use_agent(Path(agent_id): Path) -> impl IntoResponse { let input = serde_json::to_string(&info.payload.input).unwrap_or_default(); tracing::debug!( - "Processing webhook - Resource: {}, Stream ID: {}", + "Executing agent - Type: {}, Id: {}", resource, agent_id ); @@ -228,7 +228,7 @@ pub async fn create_agent(Json(payload): Json) -> impl IntoR // Verify the write by attempting to read it back match db.get(&stream_id) { Ok(Some(_)) => { - let stream_url = format!("/webhooks/{}", stream_id); + let stream_url = format!("/agents/{}", stream_id); tracing::info!( "Successfully created and verified stream URL: {}", stream_url diff --git a/test-search.ts b/test-search.ts new file mode 100755 index 0000000..d742aeb --- /dev/null +++ b/test-search.ts @@ -0,0 +1,43 @@ +#!/usr/bin/env deno -A + +const API_ROOT = "http://localhost:3006"; + +const sid = crypto.randomUUID(); +// -------------------- 1. Create the agent -------------------- +const createAgentBody = { + id: sid, + resource: "web-search", + parent: sid, + payload: { input: "What is the capital of France?" }, +}; + +const createRes = await fetch(`${API_ROOT}/api/agents`, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify(createAgentBody), +}); + + +const raw = await createRes.text(); +console.log({raw}); +const {stream_url: streamId} = JSON.parse(raw); + +console.log("Agent created with streamId:", streamId); + +// -------------------- 2. Listen to the SSE stream -------------------- +const streamUrl = `${API_ROOT}${streamId}`; +const es = new EventSource(streamUrl); + + +es.onopen = (e) => { + console.log("connected", e); +}; + +es.onmessage = (e) => { + console.log("⟶", e.data); +}; + +es.onerror = (e) => { + console.error("SSE error:", e); + es.close(); +}; \ No newline at end of file