Compare commits
555 Commits
git-branch
...
python-lib
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fd50ffa7dd | ||
|
|
2880033f06 | ||
|
|
87161c6d71 | ||
|
|
89117dbfb0 | ||
|
|
3a1b93b79d | ||
|
|
2f651e074d | ||
|
|
54a2642138 | ||
|
|
d3a74d538d | ||
|
|
82b097feb8 | ||
|
|
a8f5ff5193 | ||
|
|
b8fef1a67f | ||
|
|
ce6420ebc7 | ||
|
|
6f74fd4593 | ||
|
|
33593abd60 | ||
|
|
702bd9a3f2 | ||
|
|
8284646d15 | ||
|
|
1e0246d2f1 | ||
|
|
d82c40a1db | ||
|
|
e39983b3db | ||
|
|
01f4bcfb43 | ||
|
|
cae08116f0 | ||
|
|
a314bb587c | ||
|
|
09731e48fa | ||
|
|
cdba119297 | ||
|
|
5957b1f5df | ||
|
|
2357bea601 | ||
|
|
32281e2096 | ||
|
|
f17e329af5 | ||
|
|
c481f1ceb6 | ||
|
|
f63e05fda1 | ||
|
|
928f6f830b | ||
|
|
29e936e2f8 | ||
|
|
802fe0fcfe | ||
|
|
0ae5027542 | ||
|
|
e64e7ec93b | ||
|
|
fcb4ca1f80 | ||
|
|
54695561ad | ||
|
|
e965057f1b | ||
|
|
7ed61da2df | ||
|
|
0fba1b34a9 | ||
|
|
6ca68fc067 | ||
|
|
93bcf2f1b8 | ||
|
|
c830ff5164 | ||
|
|
97296942ab | ||
|
|
a9b58f9dd7 | ||
|
|
54d2a79a1a | ||
|
|
4147277e28 | ||
|
|
1815fb8afa | ||
|
|
058e4b3bc5 | ||
|
|
8c5cd34ec9 | ||
|
|
eea9b658da | ||
|
|
17fb99163f | ||
|
|
7257a4d1d2 | ||
|
|
0287e639b1 | ||
|
|
0999cfab54 | ||
|
|
9e18d5b9f7 | ||
|
|
9910f6d0ca | ||
|
|
6939615ce2 | ||
|
|
b7bb799e14 | ||
|
|
3eb696e22b | ||
|
|
60da15bf27 | ||
|
|
3b3e5f91d6 | ||
|
|
0fcff349d1 | ||
|
|
f8a66a7470 | ||
|
|
4672ea6c34 | ||
|
|
73e4ba5bd8 | ||
|
|
20d91af3a5 | ||
|
|
2d43e09f84 | ||
|
|
8cb6965fa7 | ||
|
|
1279c1f226 | ||
|
|
9efe8835fa | ||
|
|
23b4d7ece0 | ||
|
|
40e71f4baa | ||
|
|
2dd76b303e | ||
|
|
f7eb4ca800 | ||
|
|
f3860aee72 | ||
|
|
5d93b6fe71 | ||
|
|
f09dbce65d | ||
|
|
0783824721 | ||
|
|
e6d90444c2 | ||
|
|
dabaa3007e | ||
|
|
00fb1c3841 | ||
|
|
e7fd61a386 | ||
|
|
a17971e449 | ||
|
|
02390555ba | ||
|
|
20577becba | ||
|
|
4c3656a57b | ||
|
|
cca17f5f4d | ||
|
|
f74de7e31e | ||
|
|
cb946d095d | ||
|
|
c4ed3cac1d | ||
|
|
2e184e6c48 | ||
|
|
71f7fe60f1 | ||
|
|
c80fea1587 | ||
|
|
50cb92e548 | ||
|
|
b5f5624007 | ||
|
|
b514c93c50 | ||
|
|
f9614edfdf | ||
|
|
21325c4366 | ||
|
|
b37c60a342 | ||
|
|
4a01316597 | ||
|
|
eb474fbf52 | ||
|
|
d90fcce25b | ||
|
|
9733cd683a | ||
|
|
8462072dfd | ||
|
|
c482aa6f03 | ||
|
|
c621b64c2f | ||
|
|
9275b7fb84 | ||
|
|
bda65e63db | ||
|
|
74d6c3f356 | ||
|
|
815d7a3186 | ||
|
|
7e0f54bb73 | ||
|
|
92171ab506 | ||
|
|
4fc51375be | ||
|
|
de8a48277f | ||
|
|
dad98c137d | ||
|
|
68d9786697 | ||
|
|
db02774c9c | ||
|
|
ef5e78f979 | ||
|
|
3b955d9067 | ||
|
|
f4d3359e33 | ||
|
|
6b190fdcb1 | ||
|
|
d3d865dda9 | ||
|
|
558c69ee84 | ||
|
|
86bc79d826 | ||
|
|
6739de6bfc | ||
|
|
f21fda68f1 | ||
|
|
350561daf9 | ||
|
|
cc99a79835 | ||
|
|
9be149e22f | ||
|
|
a283c947aa | ||
|
|
ab4e737c31 | ||
|
|
4a1ce5d04f | ||
|
|
34f1e6811f | ||
|
|
8a5c220e5c | ||
|
|
daeb777e4d | ||
|
|
708f4696ca | ||
|
|
fc453f6bbc | ||
|
|
f50d99d709 | ||
|
|
c19e0fa75f | ||
|
|
805e5beb8b | ||
|
|
246b6534a1 | ||
|
|
a532fe0e28 | ||
|
|
83dc4947f4 | ||
|
|
8d77a4f153 | ||
|
|
92febb9f2b | ||
|
|
92267df836 | ||
|
|
7b4ed715ae | ||
|
|
fe9b74f261 | ||
|
|
3f720c9624 | ||
|
|
207cbffc05 | ||
|
|
0f2d049daf | ||
|
|
cd962a792e | ||
|
|
55ab852f4b | ||
|
|
1280bb454d | ||
|
|
3d295d8025 | ||
|
|
456dc422fc | ||
|
|
500e039023 | ||
|
|
3075c57bf4 | ||
|
|
cd290b0daa | ||
|
|
7dceeb13b8 | ||
|
|
686a52c702 | ||
|
|
788ef138b0 | ||
|
|
c5fbd85f0b | ||
|
|
008c87b572 | ||
|
|
b21d3365b7 | ||
|
|
a639f6bbec | ||
|
|
42b06a759f | ||
|
|
b3088ecfe4 | ||
|
|
a1d8b0650a | ||
|
|
9740c5fe74 | ||
|
|
bfdd0754ed | ||
|
|
df6404e2f5 | ||
|
|
22224b8304 | ||
|
|
11c83cab30 | ||
|
|
32f47019f0 | ||
|
|
ee3c3ff237 | ||
|
|
467734b04e | ||
|
|
2c02a11a51 | ||
|
|
28125c53b5 | ||
|
|
bd01f49307 | ||
|
|
c77f693f51 | ||
|
|
6915d54e9f | ||
|
|
4b99970499 | ||
|
|
f13e579c26 | ||
|
|
6b8e95a34f | ||
|
|
94875789ca | ||
|
|
c5a14f7ec4 | ||
|
|
ec14b08b13 | ||
|
|
8d6e60df0f | ||
|
|
fd168103b8 | ||
|
|
f2ddc223b6 | ||
|
|
e1df9b5c14 | ||
|
|
e1083a25f7 | ||
|
|
fe3ea7401d | ||
|
|
f0de6a74b6 | ||
|
|
1815a69384 | ||
|
|
cefa86ccea | ||
|
|
4d6426249a | ||
|
|
af7a73b5f7 | ||
|
|
9035fda953 | ||
|
|
2f34d06d53 | ||
|
|
b4df47d8c8 | ||
|
|
4d270c04d1 | ||
|
|
245f9e5090 | ||
|
|
ea56586c04 | ||
|
|
2b28d4e60f | ||
|
|
ee1aa7620c | ||
|
|
128759d892 | ||
|
|
9f6acff3f5 | ||
|
|
9191713854 | ||
|
|
0c871cbd68 | ||
|
|
8a71067f33 | ||
|
|
8f038a2476 | ||
|
|
52dad58417 | ||
|
|
97bbf28724 | ||
|
|
b06558f7fc | ||
|
|
9e4bb24349 | ||
|
|
2c269334ab | ||
|
|
b594e954d8 | ||
|
|
de545a639e | ||
|
|
cc9f0cc6da | ||
|
|
35588c7f9e | ||
|
|
c5920c39e8 | ||
|
|
1ffcaee719 | ||
|
|
9f619f71cc | ||
|
|
1e63d81675 | ||
|
|
a13415c31f | ||
|
|
22554bed89 | ||
|
|
db1155d958 | ||
|
|
e0b446f108 | ||
|
|
ba51fad9d2 | ||
|
|
bf19cc9606 | ||
|
|
d4b7faa3ff | ||
|
|
8c8fba1874 | ||
|
|
b53b8411c4 | ||
|
|
c380541d30 | ||
|
|
6ce3e4b250 | ||
|
|
ca970b80e7 | ||
|
|
f80fee03bd | ||
|
|
2b9ead20f9 | ||
|
|
f0f9b98f0f | ||
|
|
1cccfd3c66 | ||
|
|
79f2bc3a06 | ||
|
|
2970fc027f | ||
|
|
a8fe573099 | ||
|
|
6171621ea3 | ||
|
|
f6d0e32a02 | ||
|
|
1697548096 | ||
|
|
8bd9ea4b3f | ||
|
|
c9baddf99f | ||
|
|
bba0093d38 | ||
|
|
bfd69205ef | ||
|
|
d6c7c03ebe | ||
|
|
32b49c788c | ||
|
|
f447bdaa8f | ||
|
|
1b468c92f9 | ||
|
|
264ab81bd9 | ||
|
|
fbb2824944 | ||
|
|
34331c5a79 | ||
|
|
935e458161 | ||
|
|
31f5c10ffe | ||
|
|
c77efb4ba1 | ||
|
|
e7510b606e | ||
|
|
ff2dc465f7 | ||
|
|
43de9c4f6a | ||
|
|
126098289b | ||
|
|
087a69eb78 | ||
|
|
ad621ed1f0 | ||
|
|
f4821a0935 | ||
|
|
54bee8a76b | ||
|
|
49080efe82 | ||
|
|
5973b65a81 | ||
|
|
e0f8ed8415 | ||
|
|
fb808245e3 | ||
|
|
159462606f | ||
|
|
7d1ba026db | ||
|
|
18199cf553 | ||
|
|
1fd87edf97 | ||
|
|
76097a2c65 | ||
|
|
cc5eb4332c | ||
|
|
54ad1db5c8 | ||
|
|
a3af25f5b0 | ||
|
|
ca9ebb9972 | ||
|
|
6ec9182ad0 | ||
|
|
dbdf070383 | ||
|
|
efb033096e | ||
|
|
85ab7c0184 | ||
|
|
0c17daf51b | ||
|
|
91bd482969 | ||
|
|
010ab29959 | ||
|
|
3f897aa4f8 | ||
|
|
d17158db77 | ||
|
|
29c80be876 | ||
|
|
76dc608ed8 | ||
|
|
88aaf24794 | ||
|
|
ded4524241 | ||
|
|
65b3027992 | ||
|
|
a99144ee23 | ||
|
|
022b84e40d | ||
|
|
21125870c0 | ||
|
|
d72ca3c6cc | ||
|
|
0622b4004a | ||
|
|
8348a94edb | ||
|
|
c96bd66166 | ||
|
|
21a54d7591 | ||
|
|
b8fb092432 | ||
|
|
5f6d3ee14e | ||
|
|
f6b143d489 | ||
|
|
8e5d085924 | ||
|
|
e1b4627f33 | ||
|
|
fd50372b5d | ||
|
|
322edf01ba | ||
|
|
50059a9790 | ||
|
|
1115e30d3b | ||
|
|
518877e2f6 | ||
|
|
11f98faf74 | ||
|
|
b0749f1b2b | ||
|
|
c7cba11e85 | ||
|
|
a1bcd98682 | ||
|
|
95b077f039 | ||
|
|
840a2b71e8 | ||
|
|
8325bb3375 | ||
|
|
00e078cfa4 | ||
|
|
105039ee2f | ||
|
|
b3c3ce62ab | ||
|
|
e0a501e35b | ||
|
|
89403cd164 | ||
|
|
6d1ad5ad65 | ||
|
|
41551f5654 | ||
|
|
3c6ae7d9c0 | ||
|
|
46cf12e858 | ||
|
|
8bb7956042 | ||
|
|
d70f6dae3b | ||
|
|
9b4da26149 | ||
|
|
c8fb2a8ff4 | ||
|
|
a08cb0df7b | ||
|
|
eeee70fd5f | ||
|
|
e0615cb2b5 | ||
|
|
fe01932aad | ||
|
|
90ef491973 | ||
|
|
eb8aad0e2c | ||
|
|
e20f7e2382 | ||
|
|
925cfb5a64 | ||
|
|
d17734fd9b | ||
|
|
0cf6547fed | ||
|
|
35e712e21b | ||
|
|
4bfd392609 | ||
|
|
ed9ed5b85f | ||
|
|
53958ef6fb | ||
|
|
e263d6b598 | ||
|
|
41b42da633 | ||
|
|
5003a1e5ca | ||
|
|
949096259a | ||
|
|
4feb3d4230 | ||
|
|
4be8421fae | ||
|
|
652c2a1799 | ||
|
|
668289e248 | ||
|
|
37417f1e1f | ||
|
|
6901a209e2 | ||
|
|
67e37c58b4 | ||
|
|
9319fb8ca6 | ||
|
|
75e51b4368 | ||
|
|
65e54c1d17 | ||
|
|
894290024a | ||
|
|
c47c99e3af | ||
|
|
549b72685e | ||
|
|
5c7bc9630e | ||
|
|
e591235f8a | ||
|
|
fde1fa7173 | ||
|
|
ebbe91df3c | ||
|
|
69d55d3b84 | ||
|
|
963bcc28fe | ||
|
|
8e11381d68 | ||
|
|
39107da5c3 | ||
|
|
101fb38bfc | ||
|
|
65e2a389ca | ||
|
|
57ef35fd81 | ||
|
|
2c8296bf53 | ||
|
|
8413b6a841 | ||
|
|
1dff00b209 | ||
|
|
b43945927a | ||
|
|
d2e66d0081 | ||
|
|
576c774001 | ||
|
|
07c8dfab7c | ||
|
|
fe26b3ba57 | ||
|
|
a40beb072a | ||
|
|
720c8513c5 | ||
|
|
a7ab68a82a | ||
|
|
8a5b76955d | ||
|
|
dd3e9ffb8d | ||
|
|
c1adff4357 | ||
|
|
8dc14759a1 | ||
|
|
e6d4839ffc | ||
|
|
b90e090fec | ||
|
|
33c3ef25dc | ||
|
|
b7a16be235 | ||
|
|
b8d7c3fe1b | ||
|
|
74efddd5f4 | ||
|
|
945263e788 | ||
|
|
11cf0a20b7 | ||
|
|
04027d1310 | ||
|
|
fdc0cdeb8b | ||
|
|
10d46bb28e | ||
|
|
da1637a882 | ||
|
|
02afe10001 | ||
|
|
cbe38462e2 | ||
|
|
66fff2949c | ||
|
|
434a9bd053 | ||
|
|
54e84ef141 | ||
|
|
79580a4fec | ||
|
|
680672d641 | ||
|
|
eb5c21f8b4 | ||
|
|
4d8a8e93fb | ||
|
|
a5e72d83c5 | ||
|
|
7528f2f3b0 | ||
|
|
d1660dba51 | ||
|
|
7755c56386 | ||
|
|
ccd51b88fa | ||
|
|
65978ae49a | ||
|
|
7875745bfe | ||
|
|
2f778b9dd9 | ||
|
|
b7ce1a1bd5 | ||
|
|
d5a0face2b | ||
|
|
0358ebe99d | ||
|
|
3b3ec3e396 | ||
|
|
fa1946c7d9 | ||
|
|
decf483773 | ||
|
|
7866ca3e84 | ||
|
|
0a82070f27 | ||
|
|
e77320ac9e | ||
|
|
21486dd01b | ||
|
|
4ce5db9db3 | ||
|
|
9ccb92ab46 | ||
|
|
15e73ac7cf | ||
|
|
e5e2ff55fa | ||
|
|
781045b019 | ||
|
|
fa2cbffbd5 | ||
|
|
e4e3f15eff | ||
|
|
66dbc98ff7 | ||
|
|
00a034905b | ||
|
|
d8aa553a09 | ||
|
|
1aad10c239 | ||
|
|
1ae8ff82e5 | ||
|
|
ecfa6ea920 | ||
|
|
de01ff004e | ||
|
|
a075a22dac | ||
|
|
7da39401a4 | ||
|
|
b1a819ad57 | ||
|
|
6a0f4e8070 | ||
|
|
a941f1d9c2 | ||
|
|
8717a4fc02 | ||
|
|
7227b7d97c | ||
|
|
ef1273e815 | ||
|
|
76b863c7ea | ||
|
|
849be9e037 | ||
|
|
0695681d7c | ||
|
|
b5a67bf540 | ||
|
|
83744d69a7 | ||
|
|
e5e2c767a0 | ||
|
|
31650d2f87 | ||
|
|
c19a5dab9e | ||
|
|
84763ca40d | ||
|
|
ffd615080b | ||
|
|
bfcdbd2cda | ||
|
|
b32310dad9 | ||
|
|
6f461a78b5 | ||
|
|
e1e553e39c | ||
|
|
873f5830d0 | ||
|
|
b6c062b365 | ||
|
|
22a294c135 | ||
|
|
e141921ac8 | ||
|
|
012c0e5661 | ||
|
|
c7dfb541f3 | ||
|
|
1ea8c670f7 | ||
|
|
7ed9553ee3 | ||
|
|
ba67bef0d2 | ||
|
|
6902bb5020 | ||
|
|
8442c3a3fd | ||
|
|
e6cf33c740 | ||
|
|
39daa3258a | ||
|
|
ef60fa5ee5 | ||
|
|
9ec5f14c6b | ||
|
|
affd550c24 | ||
|
|
454598b4c0 | ||
|
|
c2016c28c8 | ||
|
|
7dd4936c57 | ||
|
|
21fefa6115 | ||
|
|
386f8ce2ec | ||
|
|
21f673ccbb | ||
|
|
f0448ada69 | ||
|
|
34c3a5f9e6 | ||
|
|
e1c0570dc5 | ||
|
|
1b89bf16ba | ||
|
|
43d2b9ac84 | ||
|
|
c1a8102d17 | ||
|
|
6bf6cb679d | ||
|
|
30c56819ca | ||
|
|
52e84b6a7c | ||
|
|
c6a9193bff | ||
|
|
f1e4a05f67 | ||
|
|
7ea8fc3b61 | ||
|
|
79cc5d8230 | ||
|
|
f4da670b85 | ||
|
|
d4a2e17537 | ||
|
|
e7edd17483 | ||
|
|
1dcee6ed85 | ||
|
|
4f1ff924a8 | ||
|
|
c9777da390 | ||
|
|
c7ae69b2d7 | ||
|
|
4f24f5fe40 | ||
|
|
ce0372fd73 | ||
|
|
694fbaa5a2 | ||
|
|
be2773de2b | ||
|
|
6df12e022a | ||
|
|
5e5ff95ef7 | ||
|
|
c8c39cfeb1 | ||
|
|
15f7d3d20e | ||
|
|
89056a9d5d | ||
|
|
db4f81cb38 | ||
|
|
b39d5925b0 | ||
|
|
2daba8f0b4 | ||
|
|
4e1bb2a25a | ||
|
|
8879b09200 | ||
|
|
c7b3f9e02d | ||
|
|
9fcc08fc3a | ||
|
|
81611988c3 | ||
|
|
bfa2adc9ce | ||
|
|
b4cc30dc29 | ||
|
|
e236250e5b | ||
|
|
7e9d0e6a2b | ||
|
|
0e9f773d55 | ||
|
|
8ac019cefb | ||
|
|
0d677e4f51 | ||
|
|
aaf6c6c72e | ||
|
|
ac78a328eb | ||
|
|
0e915e0437 | ||
|
|
d23bea5a3a | ||
|
|
4a2f553be7 | ||
|
|
7337591710 | ||
|
|
ed6ec28ab4 | ||
|
|
250533e660 | ||
|
|
1c1b2ea9f4 | ||
|
|
8cd9b383ad | ||
|
|
a673032d34 | ||
|
|
6829370337 | ||
|
|
431cbbc6c3 | ||
|
|
29a312d9ef | ||
|
|
107dae72db | ||
|
|
acfc829c9e | ||
|
|
ee8247ec03 | ||
|
|
b81fcbdfd5 | ||
|
|
8b6e21c991 | ||
|
|
109af9e274 | ||
|
|
ff8e978614 |
@@ -1,7 +1,7 @@
|
||||
;; -*- comment-column: 100; -*-
|
||||
{:config-paths ["macros" "src" "config"]
|
||||
:linters
|
||||
{ ;;
|
||||
{;;
|
||||
;; enabled optional linters (these are disabled by default)
|
||||
;;
|
||||
|
||||
@@ -173,7 +173,6 @@
|
||||
metabase.driver.sql-jdbc.execute/execute-prepared-statement!
|
||||
metabase.notification.models/create-notification!
|
||||
metabase.pulse.send/send-pulse!
|
||||
metabase.query-processor.store/store-database!
|
||||
;; Safe in tests, where we typically use a private, temporary index per thread.
|
||||
metabase.search.core/reindex!
|
||||
metabase.util/run-count!
|
||||
@@ -187,7 +186,7 @@
|
||||
:metabase/disallow-hardcoded-driver-names-in-tests
|
||||
;; don't include `:h2` since that will probably lead to a mountain of tests where we are specifically testing
|
||||
;; middleware or compilation behavior with just H2 since it's the default.
|
||||
{:drivers #{ ;; core drivers
|
||||
{:drivers #{;; core drivers
|
||||
#_:h2
|
||||
:postgres
|
||||
:mysql
|
||||
@@ -250,16 +249,15 @@
|
||||
(taoensso.nippy/extend-freeze)
|
||||
(taoensso.nippy/extend-thaw)]}
|
||||
|
||||
;; TODO (Cam 8/22/25) -- what's the point of marking stuff deprecated if we don't have Kondo enforce it? We should
|
||||
;; remove all of these and add individual ignores as needed.
|
||||
:deprecated-var
|
||||
{:exclude
|
||||
{metabase.cmd.core/dump {:namespaces ["metabase\\.cmd-test" "metabase-enterprise\\.serialization\\.cmd-test"]}
|
||||
metabase.cmd.core/load {:namespaces ["metabase\\.cmd-test" "metabase-enterprise\\.serialization\\.cmd-test"]}
|
||||
metabase.driver.sql-jdbc.execute.old-impl/set-timezone-sql {:namespaces ["metabase\\.driver.*"]}
|
||||
metabase.driver.sql-jdbc.execute/set-time-zone-if-supported! {:namespaces ["metabase\\.driver.*"]}
|
||||
metabase.driver/current-db-time {:namespaces ["metabase.*"]}
|
||||
metabase.driver/supports? {:namespaces ["metabase.*"]}
|
||||
metabase.query-processor.middleware.resolve-joins/maybe-resolve-source-table {:namespaces ["metabase.*"]}
|
||||
metabase.query-processor.util/normalize-token {:namespaces ["metabase.*"]}}}
|
||||
{metabase.driver.sql-jdbc.execute.old-impl/set-timezone-sql {:namespaces ["metabase\\.driver.*"]}
|
||||
metabase.driver.sql-jdbc.execute/set-time-zone-if-supported! {:namespaces ["metabase\\.driver.*"]}
|
||||
metabase.driver/current-db-time {:namespaces ["metabase.*"]}
|
||||
metabase.driver/supports? {:namespaces ["metabase.*"]}
|
||||
metabase.query-processor.util/normalize-token {:namespaces ["metabase.*"]}}}
|
||||
|
||||
:discouraged-var
|
||||
{clojure.core/print {:message "Use metabase.util.log instead of clojure.core/print"}
|
||||
@@ -302,6 +300,7 @@
|
||||
:discouraged-namespace
|
||||
{camel-snake-kebab.core {:message "CSK is not Turkish-safe, use the versions in metabase.util instead."}
|
||||
cheshire.core {:message "Use metabase.util.json instead of cheshire.core directly."}
|
||||
clj-time.core {:message "Use java-time.api or metabase.util.date-2 instead of clj-time"}
|
||||
clojure.tools.logging {:message "Use metabase.util.log instead of clojure.tools.logging directly"}
|
||||
grouper.core {:message "Use metabase.util.grouper instead of grouper.core"}
|
||||
honeysql.core {:message "Use Honey SQL 2. Honey SQL 1 is removed as a dependency in Metabase 49+."}
|
||||
@@ -419,6 +418,7 @@
|
||||
metabase-enterprise.transforms.api-test/with-transform-tags clojure.core/let
|
||||
metabase-enterprise.transforms.api-test/with-worker-runs clojure.core/let
|
||||
metabase-enterprise.transforms.test-util/with-transform-cleanup! clojure.core/let
|
||||
metabase-enterprise.transforms.execute/with-transform-lifecycle clojure.core/let
|
||||
metabase.actions.test-util/with-actions clojure.core/let
|
||||
metabase.api.common/let-404 clojure.core/let
|
||||
metabase.app-db.custom-migrations.util/with-temp-scheduler! clojure.core/fn
|
||||
@@ -735,7 +735,9 @@
|
||||
;; `metabase-enterprise.sandbox.query-processor*-test`
|
||||
;;
|
||||
{:pattern "^metabase(?:((?:-enterprise\\.sandbox)?\\.query-processor)|(?:\\.driver\\.sql(?!server)(?!ite))).*-test$"
|
||||
:name general-qp-and-driver-test-namespaces}]
|
||||
:name general-qp-and-driver-test-namespaces}
|
||||
{:pattern "^metabase\\.python-runner\\..*"
|
||||
:name python-runner-namespaces}]
|
||||
|
||||
:config-in-ns
|
||||
{test-namespaces
|
||||
|
||||
@@ -303,6 +303,7 @@
|
||||
models
|
||||
premium-features
|
||||
settings
|
||||
store-api
|
||||
task
|
||||
util}}
|
||||
|
||||
@@ -515,6 +516,7 @@
|
||||
public-sharing
|
||||
queries
|
||||
query-processor
|
||||
server
|
||||
settings
|
||||
tiles
|
||||
util}}
|
||||
@@ -716,6 +718,7 @@
|
||||
metabase.native-query-snippets.core}
|
||||
:uses #{api
|
||||
collections
|
||||
lib
|
||||
models
|
||||
permissions
|
||||
premium-features
|
||||
@@ -884,6 +887,19 @@
|
||||
enterprise/advanced-permissions
|
||||
enterprise/sandbox}}
|
||||
|
||||
python-runner
|
||||
{:team "Workflows"
|
||||
:api #{metabase.python-runner.api
|
||||
metabase.python-runner.core
|
||||
metabase.python-runner.init}
|
||||
:uses #{api
|
||||
driver
|
||||
models
|
||||
query-processor
|
||||
request
|
||||
util
|
||||
enterprise/transforms}}
|
||||
|
||||
queries
|
||||
{:team "Querying"
|
||||
:api #{metabase.queries.api
|
||||
@@ -1096,6 +1112,7 @@
|
||||
:api #{metabase.server.core
|
||||
metabase.server.init
|
||||
metabase.server.middleware.session
|
||||
metabase.server.settings
|
||||
metabase.server.streaming-response} ; TODO -- too many API namespaces
|
||||
:uses #{analytics
|
||||
api
|
||||
@@ -1190,6 +1207,14 @@
|
||||
:api #{metabase.startup.core}
|
||||
:uses #{util}}
|
||||
|
||||
store-api
|
||||
{:team "Cloud"
|
||||
:api #{metabase.store-api.core
|
||||
metabase.store-api.init}
|
||||
:uses #{config
|
||||
settings
|
||||
util}}
|
||||
|
||||
sync
|
||||
{:team "Querying"
|
||||
:api #{metabase.sync.api
|
||||
@@ -1557,6 +1582,7 @@
|
||||
app-db
|
||||
audit-app
|
||||
classloader
|
||||
config
|
||||
driver
|
||||
lib
|
||||
models
|
||||
@@ -1592,6 +1618,15 @@
|
||||
task
|
||||
util}}
|
||||
|
||||
enterprise/cloud-add-ons
|
||||
{:team "Cloud"
|
||||
:api #{metabase-enterprise.cloud-add-ons.api}
|
||||
:uses #{api
|
||||
events
|
||||
premium-features
|
||||
util
|
||||
enterprise/harbormaster}}
|
||||
|
||||
enterprise/content-translation
|
||||
{:team "UX West"
|
||||
:api #{metabase-enterprise.content-translation.dictionary
|
||||
@@ -1635,6 +1670,7 @@
|
||||
metabase-enterprise.database-replication.init}
|
||||
:uses #{analytics
|
||||
api
|
||||
driver
|
||||
premium-features
|
||||
settings
|
||||
util
|
||||
@@ -1704,7 +1740,7 @@
|
||||
{:team "Cloud"
|
||||
:api #{metabase-enterprise.harbormaster.client}
|
||||
:uses #{api
|
||||
cloud-migration
|
||||
store-api
|
||||
util}}
|
||||
|
||||
enterprise/impersonation
|
||||
@@ -1838,8 +1874,10 @@
|
||||
:api #{metabase-enterprise.semantic-search.api
|
||||
metabase-enterprise.semantic-search.core
|
||||
metabase-enterprise.semantic-search.init}
|
||||
:uses #{analytics
|
||||
:uses #{activity-feed
|
||||
analytics
|
||||
api
|
||||
app-db
|
||||
config
|
||||
connection-pool
|
||||
models
|
||||
@@ -1923,8 +1961,11 @@
|
||||
{:team "Querying"
|
||||
:api #{metabase-enterprise.transforms.api
|
||||
metabase-enterprise.transforms.core
|
||||
metabase-enterprise.transforms.init}
|
||||
:uses #{api
|
||||
metabase-enterprise.transforms.init
|
||||
;; TODO: Remove this from API once we remove the python-runner callback to metabase
|
||||
metabase-enterprise.transforms.settings}
|
||||
:uses #{analytics
|
||||
api
|
||||
app-db
|
||||
config
|
||||
driver
|
||||
@@ -1940,6 +1981,8 @@
|
||||
sync
|
||||
task
|
||||
task-history
|
||||
;; TODO: Remove this once we're using a better file format than CSV
|
||||
upload
|
||||
util}}
|
||||
|
||||
enterprise/upload-management
|
||||
|
||||
@@ -14,6 +14,7 @@ if (shouldLintCssModules) {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
ignorePatterns: ["!.storybook"],
|
||||
rules: {
|
||||
strict: [2, "never"],
|
||||
"no-undef": 2,
|
||||
@@ -179,6 +180,7 @@ module.exports = {
|
||||
{
|
||||
files: ["*.js", "*.jsx", "*.ts", "*.tsx"],
|
||||
rules: {
|
||||
"jtag-missing-key": "error",
|
||||
"no-unconditional-metabase-links-render": "error",
|
||||
"no-color-literals": "error",
|
||||
"no-literal-metabase-strings": "error",
|
||||
@@ -203,6 +205,7 @@ module.exports = {
|
||||
"enterprise/frontend/src/metabase-enterprise/whitelabel/**/*",
|
||||
"frontend/lint/**/*",
|
||||
"*.stories.*",
|
||||
"**/.storybook/*",
|
||||
"stories-data.*",
|
||||
"e2e/**/*",
|
||||
"**/tests/*",
|
||||
|
||||
2
.github/CODEOWNERS
vendored
@@ -1,7 +1,9 @@
|
||||
# Before changing this file, make sure you have read how we use it:
|
||||
# https://www.notion.so/metabase/Pull-Request-Code-Review-Guide-374f05df889748b69d67af753f9bc9b8?pvs=4#36550c04ceab40b5a8b8bee6264b090c
|
||||
|
||||
enterprise/frontend/src/embedding-sdk-package @metabase/embedding
|
||||
enterprise/frontend/src/embedding-sdk-bundle @metabase/embedding
|
||||
enterprise/frontend/src/embedding-sdk-shared @metabase/embedding
|
||||
frontend/src/metabase/embedding-sdk @metabase/embedding
|
||||
frontend/src/metabase/public/containers/PublicOrEmbeddedQuestion @metabase/embedding
|
||||
frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard @metabase/embedding
|
||||
|
||||
14
.github/actions/await-port/action.yml
vendored
@@ -11,6 +11,18 @@ runs:
|
||||
- name: Wait for port ${{ inputs.port }} to be ready
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Waiting for port ${{ inputs.port }} to be ready..."
|
||||
timeout=300 # 5 minutes timeout
|
||||
elapsed=0
|
||||
while ! nc -z localhost ${{ inputs.port }}; do
|
||||
sleep 0.1;
|
||||
if [ $elapsed -ge $timeout ]; then
|
||||
echo "❌ Timeout waiting for port ${{ inputs.port }} after ${timeout} seconds"
|
||||
exit 1
|
||||
fi
|
||||
sleep 1
|
||||
elapsed=$((elapsed + 1))
|
||||
if [ $((elapsed % 10)) -eq 0 ]; then
|
||||
echo " Still waiting for port ${{ inputs.port }}... ($elapsed seconds)"
|
||||
fi
|
||||
done
|
||||
echo "✅ Port ${{ inputs.port }} is ready!"
|
||||
|
||||
8
.github/actions/prepare-backend/action.yml
vendored
@@ -1,4 +1,7 @@
|
||||
name: Prepare back-end environment
|
||||
description: |
|
||||
Prepare the backend. Installs jdk, Clojure, and fetches the cache for m2. The CI config fetchs `ci-test-config.json`
|
||||
from master and lets us ignore tests at the var level if they are flaking.
|
||||
inputs:
|
||||
java-version:
|
||||
required: true
|
||||
@@ -21,9 +24,14 @@ runs:
|
||||
distribution: 'temurin'
|
||||
- name: Install Clojure CLI
|
||||
shell: bash
|
||||
continue-on-error: true
|
||||
run: |
|
||||
curl -O https://download.clojure.org/install/linux-install-${{ inputs.clojure-version }}.sh &&
|
||||
sudo bash ./linux-install-${{ inputs.clojure-version }}.sh
|
||||
- name: Fetch CI config
|
||||
shell: bash
|
||||
run: |
|
||||
curl -o ci-test-config.json https://raw.githubusercontent.com/metabase/metabase/refs/heads/master/ci-test-config.json
|
||||
- name: Check to see if dependencies should be cached
|
||||
if: ${{ contains(github.event.head_commit.message, '[ci nocache]') }}
|
||||
run: echo "Commit message includes [ci nocache]; dependencies will NOT be cached"
|
||||
|
||||
2
.github/actions/test-driver/action.yml
vendored
@@ -40,7 +40,7 @@ runs:
|
||||
list-tests: failed
|
||||
fail-on-error: false
|
||||
- name: Upload Logs on Failure
|
||||
if: failure()
|
||||
if: always() && !success()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: test-logs-${{ github.job }}
|
||||
|
||||
84
.github/scripts/get-issue-data.js
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
const githubSlackMap = require("../../release/github-slack-map.json");
|
||||
|
||||
async function getIssueData({ context, github, manualIssueNumber }) {
|
||||
let issueNumber;
|
||||
let issueData;
|
||||
let prReviews = [];
|
||||
const triggerType = context.eventName;
|
||||
|
||||
if (context.eventName === "issues") {
|
||||
issueNumber = context.payload.issue.number;
|
||||
issueData = context.payload.issue;
|
||||
} else if (context.eventName === "workflow_dispatch") {
|
||||
issueNumber = parseInt(manualIssueNumber);
|
||||
const { data } = await github.rest.issues.get({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issueNumber,
|
||||
});
|
||||
issueData = data;
|
||||
} else if (context.eventName === "pull_request_review") {
|
||||
const prNumber = context.payload.pull_request.number;
|
||||
const { data: prData } = await github.rest.pulls.get({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: prNumber,
|
||||
});
|
||||
|
||||
// Extract issue number from branch name (e.g., "claude-fix/issue-12345-some-title")
|
||||
const branchMatch = prData.head.ref.match(/claude-fix\/issue-(\d+)/);
|
||||
if (!branchMatch) {
|
||||
throw new Error(
|
||||
`Could not extract issue number from branch name: ${prData.head.ref}`,
|
||||
);
|
||||
}
|
||||
|
||||
issueNumber = parseInt(branchMatch[1]);
|
||||
|
||||
const { data } = await github.rest.issues.get({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issueNumber,
|
||||
});
|
||||
issueData = data;
|
||||
|
||||
const { data: reviews } = await github.rest.pulls.listReviews({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: prNumber,
|
||||
});
|
||||
|
||||
prReviews = reviews.filter(
|
||||
(review) =>
|
||||
review.state === "CHANGES_REQUESTED" &&
|
||||
isMetabaseMember(review.user.login),
|
||||
);
|
||||
}
|
||||
|
||||
const { data: comments } = await github.rest.issues.listComments({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issueNumber,
|
||||
});
|
||||
|
||||
const employeeComments = comments.filter((comment) =>
|
||||
isMetabaseMember(comment.user.login),
|
||||
);
|
||||
|
||||
return {
|
||||
issueNumber,
|
||||
issueData,
|
||||
employeeComments,
|
||||
prReviews,
|
||||
triggerType,
|
||||
isIssueAuthorEmployee: isMetabaseMember(issueData.user.login),
|
||||
};
|
||||
}
|
||||
|
||||
function isMetabaseMember(username) {
|
||||
return username in githubSlackMap;
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getIssueData,
|
||||
};
|
||||
3
.github/workflows/backend.yml
vendored
@@ -154,7 +154,7 @@ jobs:
|
||||
fail-on-error: false
|
||||
|
||||
- name: Upload Logs on Failure
|
||||
if: failure()
|
||||
if: always() && !success()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: test-logs-${{ matrix.java-version }}-${{ matrix.job.edition }}-${{ github.job }}
|
||||
@@ -195,6 +195,7 @@ jobs:
|
||||
- name: Run cljfmt
|
||||
run: ./bin/mage cljfmt-all --force-check
|
||||
|
||||
|
||||
be-tests-result:
|
||||
needs:
|
||||
- be-linter-eastwood
|
||||
|
||||
14
.github/workflows/block-master-source-branch-prs.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
name: Block Master Branch PRs
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize]
|
||||
|
||||
jobs:
|
||||
check-source-branch:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Block master branch PRs
|
||||
if: github.head_ref == 'master'
|
||||
run: |
|
||||
echo "PRs from `master` branches are not allowed, please use a new branch name for your PR."
|
||||
exit 1
|
||||
280
.github/workflows/claude-code-bug-fix.yml
vendored
@@ -4,97 +4,22 @@ on:
|
||||
issues:
|
||||
types:
|
||||
- labeled
|
||||
pull_request_review:
|
||||
types:
|
||||
- submitted
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
issue_number:
|
||||
description: "Issue number to fix"
|
||||
required: true
|
||||
type: string
|
||||
override_employee_check:
|
||||
description: "Override employee check for issue creator"
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
jobs:
|
||||
check-employee-and-issue:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 2
|
||||
permissions:
|
||||
contents: read
|
||||
issues: read
|
||||
if: |
|
||||
(github.event_name == 'issues' && github.event.label.name == 'Claude Bug Fix' && github.event.issue.state == 'open') ||
|
||||
(github.event_name == 'workflow_dispatch')
|
||||
outputs:
|
||||
is_employee: ${{ steps.check_employee.outputs.is_employee }}
|
||||
issue_number: ${{ steps.get_issue.outputs.issue_number }}
|
||||
issue_data: ${{ steps.get_issue.outputs.issue_data }}
|
||||
steps:
|
||||
- name: Generate GitHub App Token
|
||||
uses: actions/create-github-app-token@v1
|
||||
id: app-token
|
||||
with:
|
||||
app-id: ${{ secrets.METABASE_BOT_APP_ID }}
|
||||
private-key: ${{ secrets.METABASE_BOT_APP_PRIVATE_KEY }}
|
||||
|
||||
- name: Get issue data
|
||||
id: get_issue
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
let issueNumber, issueData;
|
||||
|
||||
if (context.eventName === 'issues') {
|
||||
// Original issue label event
|
||||
issueNumber = context.payload.issue.number;
|
||||
issueData = context.payload.issue;
|
||||
} else if (context.eventName === 'workflow_dispatch') {
|
||||
// Manual trigger with issue number input
|
||||
issueNumber = parseInt('${{ github.event.inputs.issue_number }}');
|
||||
const { data } = await github.rest.issues.get({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number: issueNumber
|
||||
});
|
||||
issueData = data;
|
||||
}
|
||||
|
||||
core.setOutput('issue_number', issueNumber);
|
||||
core.setOutput('issue_data', JSON.stringify(issueData));
|
||||
|
||||
console.log(`Issue #${issueNumber}: ${issueData.title}`);
|
||||
console.log(`Issue author: ${issueData.user.login}`);
|
||||
|
||||
- name: Check if issue creator is a Metabase employee
|
||||
id: check_employee
|
||||
uses: actions/github-script@v7
|
||||
env:
|
||||
ISSUE_DATA: ${{ steps.get_issue.outputs.issue_data }}
|
||||
with:
|
||||
github-token: ${{ steps.app-token.outputs.token }}
|
||||
script: |
|
||||
const issueData = JSON.parse(process.env.ISSUE_DATA);
|
||||
const issueAuthor = issueData.user.login;
|
||||
|
||||
try {
|
||||
// Check if user is a member of the metabase organization (including private members)
|
||||
const { data: membership } = await github.rest.orgs.getMembershipForUser({
|
||||
org: 'metabase',
|
||||
username: issueAuthor
|
||||
});
|
||||
|
||||
if (membership.state === 'active') {
|
||||
console.log(`User ${issueAuthor} is an active member of the Metabase organization. Proceeding with bug fix automation.`);
|
||||
core.setOutput('is_employee', 'true');
|
||||
} else {
|
||||
console.log(`User ${issueAuthor} is not an active member of the Metabase organization. Skipping bug fix automation.`);
|
||||
core.setOutput('is_employee', 'false');
|
||||
}
|
||||
} catch (error) {
|
||||
if (error.status === 404) {
|
||||
console.log(`User ${issueAuthor} is not a member of the Metabase organization. Skipping bug fix automation.`);
|
||||
} else {
|
||||
console.error('Error checking organization membership:', error);
|
||||
}
|
||||
core.setOutput('is_employee', 'false');
|
||||
}
|
||||
|
||||
auto-fix-bug:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 30
|
||||
@@ -103,8 +28,10 @@ jobs:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
id-token: write
|
||||
needs: check-employee-and-issue
|
||||
if: needs.check-employee-and-issue.outputs.is_employee == 'true'
|
||||
if: |
|
||||
(github.event_name == 'issues' && github.event.label.name == 'Claude Bug Fix' && github.event.issue.state == 'open') ||
|
||||
(github.event_name == 'workflow_dispatch') ||
|
||||
(github.event_name == 'pull_request_review' && github.event.review.state == 'changes_requested' && startsWith(github.event.pull_request.head.ref, 'claude-fix/'))
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
@@ -112,67 +39,95 @@ jobs:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Get issue data and check employee status
|
||||
id: get_issue
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const { getIssueData } = require('${{ github.workspace }}/.github/scripts/get-issue-data.js');
|
||||
|
||||
try {
|
||||
const result = await getIssueData({
|
||||
context,
|
||||
github,
|
||||
manualIssueNumber: '${{ github.event.inputs.issue_number }}'
|
||||
});
|
||||
|
||||
const { issueNumber, issueData, employeeComments, prReviews, triggerType, isIssueAuthorEmployee } = result;
|
||||
|
||||
// Check employee status and fail if not authorized
|
||||
if (!result.isIssueAuthorEmployee && '${{ github.event.inputs.override_employee_check }}' !== 'true') {
|
||||
core.setFailed(`User ${result.issueData.user.login} is not a Metabase employee. Skipping bug fix automation.`);
|
||||
}
|
||||
|
||||
core.setOutput('issue_number', issueNumber);
|
||||
core.setOutput('issue_data', JSON.stringify(issueData));
|
||||
core.setOutput('issue_comments', JSON.stringify(employeeComments));
|
||||
core.setOutput('pr_reviews', JSON.stringify(prReviews));
|
||||
core.setOutput('trigger_type', triggerType);
|
||||
} catch (error) {
|
||||
core.setFailed(error.message);
|
||||
}
|
||||
|
||||
- name: Set up git configuration
|
||||
run: |
|
||||
git config --global user.name "Claude Code[bot]"
|
||||
git config --global user.email "noreply@anthropic.com"
|
||||
|
||||
- name: Prepare dynamic issue info
|
||||
id: prepare_issue_info
|
||||
- name: Prepare issue context and bug fix prompt
|
||||
id: prepare_prompt
|
||||
uses: actions/github-script@v7
|
||||
env:
|
||||
ISSUE_DATA: ${{ needs.check-employee-and-issue.outputs.issue_data }}
|
||||
ISSUE_DATA: ${{ steps.get_issue.outputs.issue_data }}
|
||||
ISSUE_COMMENTS: ${{ steps.get_issue.outputs.issue_comments }}
|
||||
PR_REVIEWS: ${{ steps.get_issue.outputs.pr_reviews }}
|
||||
TRIGGER_TYPE: ${{ steps.get_issue.outputs.trigger_type }}
|
||||
with:
|
||||
script: |
|
||||
const issueData = JSON.parse(process.env.ISSUE_DATA);
|
||||
const issueNumber = '${{ needs.check-employee-and-issue.outputs.issue_number }}';
|
||||
const issueComments = JSON.parse(process.env.ISSUE_COMMENTS);
|
||||
const prReviews = JSON.parse(process.env.PR_REVIEWS);
|
||||
const triggerType = process.env.TRIGGER_TYPE;
|
||||
const issueNumber = '${{ steps.get_issue.outputs.issue_number }}';
|
||||
|
||||
// Convert issue title to kebab case
|
||||
// Convert issue title to kebab case and create branch name
|
||||
const issueTitle = issueData.title || 'untitled';
|
||||
const kebabTitle = issueTitle
|
||||
.toLowerCase()
|
||||
.replace(/[^a-z0-9]+/g, '-')
|
||||
.replace(/^-+|-+$/g, '')
|
||||
.replace(/-+/g, '-')
|
||||
.substring(0, 50); // Limit length
|
||||
.substring(0, 50);
|
||||
const branchName = `claude-fix/issue-${issueNumber}-${kebabTitle}`;
|
||||
|
||||
// Create base branch name
|
||||
const baseBranchName = `claude-fix/issue-${issueNumber}-${kebabTitle}`;
|
||||
core.exportVariable('BASE_BRANCH_NAME', baseBranchName);
|
||||
// Format data for bash environment
|
||||
const formattedComments = issueComments.length > 0
|
||||
? issueComments.map(comment =>
|
||||
`**Comment by @${comment.user.login} on ${comment.created_at}:**\n${comment.body}`
|
||||
).join('\n\n---\n\n')
|
||||
: '';
|
||||
const formattedReviews = prReviews.length > 0
|
||||
? prReviews.map(review =>
|
||||
`**Review by @${review.user.login} on ${review.submitted_at} (Changes Requested):**\n${review.body || 'No review comment provided'}`
|
||||
).join('\n\n---\n\n')
|
||||
: '';
|
||||
|
||||
// Export issue info for the prompt
|
||||
core.exportVariable('BRANCH_NAME', branchName);
|
||||
core.exportVariable('ISSUE_NUMBER', issueNumber);
|
||||
core.exportVariable('ISSUE_TITLE', issueData.title);
|
||||
core.exportVariable('ISSUE_AUTHOR', issueData.user.login);
|
||||
core.exportVariable('ISSUE_CREATED', issueData.created_at);
|
||||
core.exportVariable('ISSUE_BODY', issueData.body || 'No description provided');
|
||||
core.exportVariable('ISSUE_COMMENTS_FORMATTED', formattedComments);
|
||||
core.exportVariable('PR_REVIEWS_FORMATTED', formattedReviews);
|
||||
core.exportVariable('TRIGGER_TYPE', triggerType);
|
||||
|
||||
- name: Determine branch strategy
|
||||
- name: Generate bug fix prompt
|
||||
run: |
|
||||
# Use the base branch name (no counters)
|
||||
BRANCH_NAME="${{ env.BASE_BRANCH_NAME }}"
|
||||
|
||||
# Check if this exact branch already exists
|
||||
if git branch -r --list "origin/${BRANCH_NAME}" | grep -q .; then
|
||||
echo "Branch already exists: $BRANCH_NAME"
|
||||
echo "Will push to existing branch and skip PR creation"
|
||||
echo "BRANCH_EXISTS=true" >> $GITHUB_ENV
|
||||
else
|
||||
echo "Creating new branch: $BRANCH_NAME"
|
||||
echo "Will create new PR"
|
||||
echo "BRANCH_EXISTS=false" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
# Export the branch name
|
||||
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
|
||||
|
||||
- name: Prepare bug fix prompt
|
||||
id: prepare_prompt
|
||||
run: |
|
||||
# Prepare the prompt for Claude
|
||||
cat << 'EOF' >> $GITHUB_ENV
|
||||
BUG_FIX_PROMPT<<PROMPT_END
|
||||
You are helping to automatically fix a bug reported in GitHub issue #${{ env.ISSUE_NUMBER }}.
|
||||
You are helping to fix a bug reported in GitHub issue #${{ env.ISSUE_NUMBER }}.
|
||||
|
||||
## Bug Report Details
|
||||
**Title:** ${{ env.ISSUE_TITLE }}
|
||||
@@ -182,8 +137,27 @@ jobs:
|
||||
**Description:**
|
||||
${{ env.ISSUE_BODY }}
|
||||
|
||||
**Comments:**
|
||||
${{ env.ISSUE_COMMENTS_FORMATTED }}
|
||||
EOF
|
||||
|
||||
# Add review feedback section only if this is a review trigger
|
||||
if [ "${{ env.TRIGGER_TYPE }}" = "pull_request_review" ]; then
|
||||
cat << 'EOF' >> $GITHUB_ENV
|
||||
|
||||
## Previous Fix Attempt - Review Feedback (MUST ADDRESS)
|
||||
Your previous automated fix attempt received the following feedback that needs to be addressed:
|
||||
|
||||
${{ env.PR_REVIEWS_FORMATTED }}
|
||||
EOF
|
||||
fi
|
||||
|
||||
# Add the rest of the prompt (always the same)
|
||||
cat << 'EOF' >> $GITHUB_ENV
|
||||
|
||||
## Instructions
|
||||
1. **Analyze the bug report** - Understand what the issue is describing
|
||||
1. **Analyze the issue description and comments** - Understand what the issue is describing
|
||||
a. Pay particular attention to reproduction steps and if there's an agreed upon fix.
|
||||
2. **Search the codebase** - Use Grep and Glob tools to find relevant files
|
||||
3. **Implement a fix** - Follow existing code patterns and conventions
|
||||
4. **Test the fix** - Run appropriate tests using the commands in CLAUDE.md:
|
||||
@@ -205,15 +179,26 @@ jobs:
|
||||
- Only modify actual production code in the main repository directories
|
||||
- The scratchpad will be cleaned up automatically - nothing from it will be committed
|
||||
|
||||
## If You Cannot Fix The Bug
|
||||
If you determine that you cannot create a definitive fix, create a file called `FAILED_FIX_ANALYSIS.md` with:
|
||||
1. **Why No Fix** - Specific reason why you couldn't implement a fix
|
||||
2. **Tool Limitations** - If you needed additional tools/access that weren't available
|
||||
|
||||
Start by understanding the bug and then systematically work toward a solution.
|
||||
PROMPT_END
|
||||
EOF
|
||||
|
||||
- name: Determine branch strategy
|
||||
run: |
|
||||
BRANCH_NAME="${{ env.BRANCH_NAME }}"
|
||||
if git branch -r --list "origin/${BRANCH_NAME}" | grep -q .; then
|
||||
echo "Branch already exists: $BRANCH_NAME"
|
||||
echo "Will push to existing branch and skip PR creation"
|
||||
echo "BRANCH_EXISTS=true" >> $GITHUB_ENV
|
||||
else
|
||||
echo "Creating new branch: $BRANCH_NAME"
|
||||
echo "Will create new PR"
|
||||
echo "BRANCH_EXISTS=false" >> $GITHUB_ENV
|
||||
fi
|
||||
|
||||
# Export the branch name
|
||||
echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV
|
||||
|
||||
- name: Create scratchpad directory for Claude
|
||||
run: |
|
||||
# Create a scratchpad directory for Claude to use for temporary files
|
||||
@@ -249,20 +234,6 @@ jobs:
|
||||
- name: Check for changes and analysis
|
||||
id: check_changes
|
||||
run: |
|
||||
# Check if Claude created an analysis file first and store its content
|
||||
if [ -f "FAILED_FIX_ANALYSIS.md" ]; then
|
||||
echo "has_analysis=true" >> $GITHUB_OUTPUT
|
||||
echo "Analysis file found"
|
||||
# Store analysis content in a GitHub output (base64 encoded to handle multiline)
|
||||
ANALYSIS_CONTENT=$(base64 -w 0 FAILED_FIX_ANALYSIS.md)
|
||||
echo "analysis_content=$ANALYSIS_CONTENT" >> $GITHUB_OUTPUT
|
||||
# Remove analysis file so it doesn't count as a code change
|
||||
rm -f FAILED_FIX_ANALYSIS.md
|
||||
else
|
||||
echo "has_analysis=false" >> $GITHUB_OUTPUT
|
||||
echo "No analysis file found"
|
||||
fi
|
||||
|
||||
# Now check for actual code changes (excluding analysis file)
|
||||
if [ -n "$(git status --porcelain)" ]; then
|
||||
echo "has_changes=true" >> $GITHUB_OUTPUT
|
||||
@@ -278,25 +249,16 @@ jobs:
|
||||
id: prepare_reviewers
|
||||
uses: actions/github-script@v7
|
||||
env:
|
||||
ISSUE_DATA: ${{ needs.check-employee-and-issue.outputs.issue_data }}
|
||||
ISSUE_DATA: ${{ steps.get_issue.outputs.issue_data }}
|
||||
with:
|
||||
script: |
|
||||
// Get existing team labels from the issue
|
||||
const issueData = JSON.parse(process.env.ISSUE_DATA);
|
||||
const issueLabels = issueData.labels.map(label => label.name);
|
||||
const teamLabels = issueLabels.filter(label => label.startsWith('.Team/'));
|
||||
|
||||
console.log('Issue labels:', issueLabels);
|
||||
console.log('Team labels found:', teamLabels);
|
||||
|
||||
// Add issue creator as reviewer
|
||||
const issueCreator = issueData.user.login;
|
||||
|
||||
core.setOutput('team_labels', teamLabels.join(','));
|
||||
core.setOutput('reviewers', issueCreator);
|
||||
|
||||
console.log('Reviewer:', issueCreator);
|
||||
|
||||
- name: Create Pull Request
|
||||
if: steps.check_changes.outputs.has_changes == 'true'
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
@@ -363,25 +325,3 @@ jobs:
|
||||
with:
|
||||
script: |
|
||||
console.log('🤖 No code changes were made by Claude.');
|
||||
|
||||
// Check if Claude provided a detailed analysis
|
||||
if ('${{ steps.check_changes.outputs.has_analysis }}' === 'true') {
|
||||
try {
|
||||
// Decode the base64-encoded analysis content
|
||||
const analysisBase64 = '${{ steps.check_changes.outputs.analysis_content }}';
|
||||
const analysisContent = Buffer.from(analysisBase64, 'base64').toString('utf8');
|
||||
console.log('📋 Claude provided detailed analysis:');
|
||||
console.log('='.repeat(50));
|
||||
console.log(analysisContent);
|
||||
console.log('='.repeat(50));
|
||||
} catch (error) {
|
||||
console.log('❌ Could not decode analysis content:', error);
|
||||
}
|
||||
} else {
|
||||
console.log('ℹ️ No detailed analysis file was created by Claude.');
|
||||
console.log('This could be because:');
|
||||
console.log('- The issue requires more context or clarification');
|
||||
console.log('- The fix is complex and requires human judgment');
|
||||
console.log('- The issue is not a straightforward code bug');
|
||||
console.log('- Claude couldn\'t locate the relevant code to modify');
|
||||
}
|
||||
|
||||
36
.github/workflows/docs-links.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
name: Check doc links
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- "docs/**"
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
link-checker:
|
||||
name: Check documentation links
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
sparse-checkout: |
|
||||
docs
|
||||
.lychee
|
||||
|
||||
- name: Cache lychee
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.cache/lychee
|
||||
key: lychee-${{ runner.os }}-${{ hashFiles('.lychee/config.toml') }}
|
||||
|
||||
- name: Run link checker
|
||||
id: link-check
|
||||
uses: lycheeverse/lychee-action@v2
|
||||
with:
|
||||
fail: true
|
||||
args: docs --config ./.lychee/config.toml --offline
|
||||
format: markdown
|
||||
97
.github/workflows/drivers.yml
vendored
@@ -44,7 +44,7 @@ jobs:
|
||||
echo "A relevant team label is present. Tier 3 driver tests will run."
|
||||
else
|
||||
echo "Checking for changes in relevant folders..."
|
||||
CHANGED_FILES=$(git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }})
|
||||
CHANGED_FILES=$(git diff --name-only $(git merge-base ${{ github.event.pull_request.base.sha }} ${{ github.sha }}) ${{ github.sha }})
|
||||
|
||||
# Initialize an empty array to store folders with changes
|
||||
CHANGED_FOLDERS=()
|
||||
@@ -338,6 +338,12 @@ jobs:
|
||||
name: H2
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
|
||||
- name: Start python-runner
|
||||
working-directory: python-runner
|
||||
run: make run-all
|
||||
- name: Test H2 driver
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
@@ -442,6 +448,12 @@ jobs:
|
||||
name: "${{ matrix.version.name }} ${{ matrix.job.name }}"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
|
||||
- name: Start python-runner
|
||||
working-directory: python-runner
|
||||
run: make run-all
|
||||
- name: Test ${{ matrix.version.name }}
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
@@ -745,6 +757,12 @@ jobs:
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: true
|
||||
token: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
|
||||
- name: Start python-runner
|
||||
working-directory: python-runner
|
||||
run: make run-all
|
||||
- name: Test ${{ matrix.version.name }} (${{ matrix.job.name }})
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
@@ -1040,43 +1058,44 @@ jobs:
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
be-tests-starburst-ee:
|
||||
needs: determine-driver-skips
|
||||
if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 60
|
||||
env:
|
||||
CI: 'true'
|
||||
DRIVERS: starburst
|
||||
services:
|
||||
starburst:
|
||||
image: trinodb/trino:latest
|
||||
env:
|
||||
CATALOG_MANAGEMENT: dynamic
|
||||
ports:
|
||||
- "8080:8080"
|
||||
name: Starburst
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Make plugins directory
|
||||
run: mkdir plugins
|
||||
- name: Test Starburst driver
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
junit-name: 'be-tests-starburst-ee'
|
||||
test-args: >-
|
||||
:only-tags [:mb/driver-tests]
|
||||
- name: Upload Test Results
|
||||
uses: ./.github/actions/upload-test-results
|
||||
if: always()
|
||||
with:
|
||||
input-path: ./target/junit/
|
||||
output-name: ${{ github.job }}
|
||||
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
|
||||
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
# TODO(dpsutton, 2025-08-20): Re-enable starburst when we figure out why it randomly dies in CI
|
||||
# be-tests-starburst-ee:
|
||||
# needs: determine-driver-skips
|
||||
# if: ${{ !inputs.skip && !(needs.determine-driver-skips.outputs.skip == 'true') }}
|
||||
# runs-on: ubuntu-22.04
|
||||
# timeout-minutes: 60
|
||||
# env:
|
||||
# CI: 'true'
|
||||
# DRIVERS: starburst
|
||||
# services:
|
||||
# starburst:
|
||||
# image: trinodb/trino:latest
|
||||
# env:
|
||||
# CATALOG_MANAGEMENT: dynamic
|
||||
# ports:
|
||||
# - "8080:8080"
|
||||
# name: Starburst
|
||||
# steps:
|
||||
# - uses: actions/checkout@v4
|
||||
# - name: Make plugins directory
|
||||
# run: mkdir plugins
|
||||
# - name: Test Starburst driver
|
||||
# uses: ./.github/actions/test-driver
|
||||
# with:
|
||||
# junit-name: 'be-tests-starburst-ee'
|
||||
# test-args: >-
|
||||
# :only-tags [:mb/driver-tests]
|
||||
# - name: Upload Test Results
|
||||
# uses: ./.github/actions/upload-test-results
|
||||
# if: always()
|
||||
# with:
|
||||
# input-path: ./target/junit/
|
||||
# output-name: ${{ github.job }}
|
||||
# bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
|
||||
# aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
|
||||
# aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
|
||||
# aws-region: ${{ vars.AWS_REGION }}
|
||||
# trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
# TODO(rileythomp, 2025-08-20): Re-enable vertica tests once the docker image is updated
|
||||
# be-tests-vertica-ee:
|
||||
@@ -1136,7 +1155,7 @@ jobs:
|
||||
- be-tests-sparksql-ee
|
||||
- be-tests-sqlite-ee
|
||||
- be-tests-sqlserver
|
||||
- be-tests-starburst-ee
|
||||
# - be-tests-starburst-ee
|
||||
# TODO(rileythomp, 2025-08-20): Re-enable vertica tests once the docker image is updated
|
||||
# - be-tests-vertica-ee
|
||||
- be-tests-clickhouse-ee
|
||||
|
||||
@@ -192,7 +192,7 @@ jobs:
|
||||
# - starts it
|
||||
# - runs its Cypress tests against the local metabase.jar and local @metabase/embedding-sdk-react package.
|
||||
# The job is not required, though if it's failing better to be sure that it's not caused by a breaking change.
|
||||
# For more details see `Sample Apps compatibility with Embedding SDK tests` in `enterprise/frontend/src/embedding-sdk-bundle/dev.md`
|
||||
# For more details see `Sample Apps compatibility with Embedding SDK tests` in `enterprise/frontend/src/embedding-sdk-package/dev.md`
|
||||
e2e-sample-apps-tests:
|
||||
needs: [get-build-requirements, get-sample-apps-data, build]
|
||||
strategy:
|
||||
@@ -316,7 +316,7 @@ jobs:
|
||||
# - starts an app
|
||||
# - runs its Cypress tests against the e2e test metabase instance and local @metabase/embedding-sdk-react package.
|
||||
# The job is not required, though if it's failing better to be sure that it's not caused by a breaking change.
|
||||
# For more details see `Embedding SDK integration tests with Host Apps` in `enterprise/frontend/src/embedding-sdk-bundle/dev.md`
|
||||
# For more details see `Embedding SDK integration tests with Host Apps` in `enterprise/frontend/src/embedding-sdk-package/dev.md`
|
||||
e2e-host-apps-tests:
|
||||
needs: [get-build-requirements, build]
|
||||
strategy:
|
||||
|
||||
4
.github/workflows/embedding-sdk.yml
vendored
@@ -137,7 +137,7 @@ jobs:
|
||||
if: ${{ steps.docs-generation.outcome == 'failure' }}
|
||||
run: exit 1
|
||||
|
||||
# See `Component e2e tests` in `enterprise/frontend/src/embedding-sdk-bundle/dev.md`
|
||||
# See `Component e2e tests` in `enterprise/frontend/src/embedding-sdk-package/dev.md`
|
||||
sdk-e2e-tests:
|
||||
name: "SDK e2e tests"
|
||||
uses: ./.github/workflows/e2e-component-tests-embedding-sdk.yml
|
||||
@@ -160,7 +160,7 @@ jobs:
|
||||
- embedding-sdk-docs-snippets-type-check
|
||||
- embedding-sdk-api-documentation-generation-validation
|
||||
- sdk-e2e-tests
|
||||
# - e2e-component-tests-embedding-sdk-backward-compatibility
|
||||
- e2e-component-tests-embedding-sdk-backward-compatibility
|
||||
if: always() && !cancelled()
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
|
||||
2
.github/workflows/frontend.yml
vendored
@@ -52,6 +52,8 @@ jobs:
|
||||
run: yarn run lint-prettier-pure
|
||||
- name: Run ESLint linter
|
||||
run: yarn run lint-eslint-pure
|
||||
- name: Run CSS linter
|
||||
run: yarn run lint-css
|
||||
|
||||
fe-type-check:
|
||||
if: ${{ !inputs.skip }}
|
||||
|
||||
32
.github/workflows/links.yml
vendored
@@ -1,32 +0,0 @@
|
||||
name: Links
|
||||
|
||||
on:
|
||||
repository_dispatch:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: "0 0 * * 0"
|
||||
|
||||
jobs:
|
||||
linkChecker:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write # required for peter-evans/create-issue-from-file
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Link Checker
|
||||
id: lychee
|
||||
uses: lycheeverse/lychee-action@v2
|
||||
with:
|
||||
fail: false
|
||||
args: docs --include-fragments --config ./.lychee/config.toml --verbose --no-progress
|
||||
format: markdown
|
||||
|
||||
- name: Create Issue From File
|
||||
if: steps.lychee.outputs.exit_code != 0
|
||||
uses: peter-evans/create-issue-from-file@v5
|
||||
with:
|
||||
title: Link Checker Report
|
||||
content-filepath: ./.lychee/out.md
|
||||
labels: "Type:Documentation"
|
||||
assignees: jeff-bruemmer
|
||||
104
.github/workflows/release-embedding-sdk.yml
vendored
@@ -5,19 +5,12 @@ on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
description: "Branch we want to release the SDK from"
|
||||
description: "Branch we want to release the SDK from (to release from other branches use the workflow from those branches)"
|
||||
type: choice
|
||||
required: true
|
||||
default: "master"
|
||||
options:
|
||||
- master
|
||||
- release-x.51.x
|
||||
- release-x.52.x
|
||||
- release-x.53.x
|
||||
- release-x.54.x
|
||||
- release-x.55.x
|
||||
- release-x.56.x
|
||||
- esbuild-main
|
||||
|
||||
concurrency:
|
||||
# We want to ensure only one job is running at a time per branch because
|
||||
@@ -178,41 +171,39 @@ jobs:
|
||||
outputs:
|
||||
sdk_version: ${{ fromJson(steps.new-sdk-version.outputs.result).version }}
|
||||
major_version: ${{ fromJson(steps.new-sdk-version.outputs.result).majorVersion }}
|
||||
pre_release_label: ${{ fromJson(steps.new-sdk-version.outputs.result).preReleaseLabel }}
|
||||
steps:
|
||||
- name: Check out the code using the provided branch
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: ${{ inputs.branch }}
|
||||
|
||||
- name: Prepare build scripts
|
||||
run: yarn --cwd release --frozen-lockfile && yarn --cwd release build
|
||||
|
||||
- name: Get current SDK version
|
||||
id: current-sdk-version
|
||||
run: |
|
||||
VERSION=$(jq -r .version ./enterprise/frontend/src/embedding-sdk-bundle/package.template.json)
|
||||
VERSION=$(jq -r .version ./enterprise/frontend/src/embedding-sdk-package/package.template.json)
|
||||
echo "sdk_current_version=$VERSION" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Get next SDK patch version
|
||||
- name: Get next SDK patch or pre-release version
|
||||
id: new-sdk-version
|
||||
uses: actions/github-script@v7
|
||||
with:
|
||||
script: |
|
||||
const currentVersion = "${{ steps.current-sdk-version.outputs.sdk_current_version }}";
|
||||
const [currentVersionWithoutSuffix, suffix] = currentVersion.split("-");
|
||||
const versionParts = currentVersionWithoutSuffix.split(".");
|
||||
versionParts[versionParts.length - 1] = parseInt(versionParts.at(-1)) + 1;
|
||||
const newVersion = versionParts.join(".");
|
||||
const [_, majorVersion] = versionParts
|
||||
script: | #js
|
||||
const { getNextSdkVersion } = require('${{ github.workspace }}/release/dist/index.cjs');
|
||||
|
||||
if (!suffix) {
|
||||
return {
|
||||
version: newVersion,
|
||||
majorVersion
|
||||
};
|
||||
}
|
||||
const branch = "${{ inputs.branch }}";
|
||||
const currentVersion = "${{ steps.current-sdk-version.outputs.sdk_current_version }}";
|
||||
|
||||
const result = getNextSdkVersion(branch, currentVersion);
|
||||
|
||||
return {
|
||||
version: `${newVersion}-${suffix}`,
|
||||
majorVersion
|
||||
}
|
||||
version: result.version,
|
||||
preReleaseLabel: result.preReleaseLabel,
|
||||
majorVersion: result.majorVersion
|
||||
};
|
||||
|
||||
- name: Append workflow summary
|
||||
run: |
|
||||
@@ -336,6 +327,7 @@ jobs:
|
||||
git config --global user.name "Metabase Automation"
|
||||
|
||||
- name: Update readme
|
||||
if: inputs.branch != 'master'
|
||||
run: |
|
||||
bash ./bin/embedding-sdk/release_utils.bash update_readme ${{ env.sdk_version }}
|
||||
|
||||
@@ -344,11 +336,13 @@ jobs:
|
||||
bash ./bin/embedding-sdk/release_utils.bash update_package_json_template ${{ env.sdk_version }}
|
||||
|
||||
- name: Retrieve SDK changelog diff
|
||||
if: inputs.branch != 'master'
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: sdk-changelog-diff
|
||||
|
||||
- name: Update changelog
|
||||
if: inputs.branch != 'master'
|
||||
run: |
|
||||
cat changelog-diff enterprise/frontend/src/embedding-sdk-bundle/CHANGELOG.md > new-changelog
|
||||
mv new-changelog enterprise/frontend/src/embedding-sdk-bundle/CHANGELOG.md
|
||||
@@ -356,12 +350,23 @@ jobs:
|
||||
- name: Create a PR updating readme + published version, and changelog (using GitHub Metabase Automation account)
|
||||
run: |
|
||||
git checkout -b update-sdk-version-${{ env.sdk_version }}
|
||||
git commit -a -m 'Update Readme version references and published npm version to ${{ env.sdk_version }}'
|
||||
|
||||
if [ "${{ inputs.branch }}" = "master" ]; then
|
||||
COMMIT_MSG="chore(sdk): Update published npm version to ${{ env.sdk_version }}"
|
||||
PR_TITLE="chore(sdk): Update SDK version to ${{ env.sdk_version }}"
|
||||
PR_BODY="Update published npm package version to ${{ env.sdk_version }}"
|
||||
else
|
||||
COMMIT_MSG="docs(sdk): Update Readme version references and published npm version to ${{ env.sdk_version }}"
|
||||
PR_TITLE="docs(sdk): Update SDK version to ${{ env.sdk_version }}"
|
||||
PR_BODY="Update Readme version references and published npm package version to ${{ env.sdk_version }}"
|
||||
fi
|
||||
|
||||
git commit -a -m "$COMMIT_MSG"
|
||||
git push origin HEAD
|
||||
gh pr create --base ${{ inputs.branch }}\
|
||||
--assignee "${GITHUB_ACTOR}"\
|
||||
--title "docs(sdk): Update SDK version to ${{ env.sdk_version }}"\
|
||||
--body "Update Readme version references and published npm package version to ${{ env.sdk_version }}"
|
||||
gh pr create --base "${{ inputs.branch }}" \
|
||||
--assignee "${GITHUB_ACTOR}" \
|
||||
--title "$PR_TITLE" \
|
||||
--body "$PR_BODY"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.METABASE_AUTOMATION_USER_TOKEN }}
|
||||
|
||||
@@ -389,21 +394,36 @@ jobs:
|
||||
name: metabase-sdk
|
||||
path: sdk
|
||||
|
||||
- name: Compute master tag
|
||||
id: compute-tag
|
||||
run: |
|
||||
if [ -n "${{ needs.determine-sdk-version.outputs.pre_release_label }}" ]; then
|
||||
echo "masterTag=${{ needs.determine-sdk-version.outputs.pre_release_label }}" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "masterTag=nightly" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Publish to NPM
|
||||
working-directory: sdk
|
||||
run: |
|
||||
echo //registry.npmjs.org/:_authToken=${{ secrets.NPM_RELEASE_TOKEN }} > .npmrc
|
||||
# Please keep the value in sync with `inputs.branch`'s release branch
|
||||
npm publish --tag ${{fromJson('{
|
||||
"master": "nightly",
|
||||
"release-x.51.x": "51-stable",
|
||||
"release-x.52.x": "52-stable",
|
||||
"release-x.53.x": "53-stable",
|
||||
"release-x.54.x": "54-stable",
|
||||
"release-x.55.x": "55-stable",
|
||||
"release-x.56.x": "56-stable",
|
||||
"esbuild-main": "56-esbuild"
|
||||
}')[inputs.branch]}}
|
||||
|
||||
TAG=$(jq -r --null-input \
|
||||
--arg branch "${{ inputs.branch }}" \
|
||||
--arg masterTag "${{ steps.compute-tag.outputs.masterTag }}" '
|
||||
{
|
||||
"master": $masterTag,
|
||||
"release-x.51.x": "51-stable",
|
||||
"release-x.52.x": "52-stable",
|
||||
"release-x.53.x": "53-stable",
|
||||
"release-x.54.x": "54-stable",
|
||||
"release-x.55.x": "55-stable",
|
||||
"release-x.56.x": "56-stable"
|
||||
}[$branch]'
|
||||
)
|
||||
|
||||
echo "Resolved npm tag: $TAG"
|
||||
npm publish --tag "$TAG"
|
||||
|
||||
- name: Add `latest` tag to the latest release branch (`release-x.55.x`) deployment
|
||||
if: ${{ inputs.branch == 'release-x.56.x' }}
|
||||
|
||||
251
.github/workflows/semantic-search.yml
vendored
@@ -12,7 +12,7 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
semantic-search-tests-pgvector:
|
||||
semantic-search-tests-h2:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 60
|
||||
@@ -20,11 +20,9 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
version:
|
||||
- name: pgvector pg16
|
||||
junit-name: semantic-search-tests-pgvector-16
|
||||
image: pgvector/pgvector:pg16
|
||||
env:
|
||||
enable-ssl-tests: 'false'
|
||||
- name: H2 with pgvector pg17
|
||||
junit-name: semantic-search-tests-h2-pgvector-17
|
||||
pgvector-image: pgvector/pgvector:pg17
|
||||
job:
|
||||
- name: Semantic Search Tests
|
||||
build-static-viz: false
|
||||
@@ -34,7 +32,7 @@ jobs:
|
||||
|
||||
services:
|
||||
pgvector:
|
||||
image: ${{ matrix.version.image }}
|
||||
image: ${{ matrix.version.pgvector-image }}
|
||||
ports:
|
||||
- "5432:5432"
|
||||
env:
|
||||
@@ -42,21 +40,6 @@ jobs:
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: postgres
|
||||
env:
|
||||
# Only run old migrations tests on pushes to master or release branches. All other branches should skip tests
|
||||
# with the tag `mb/old-migrations-test`. `__ADDITIONAL_EXCLUDED_TAG__` is not used anywhere outside of splicing
|
||||
# it in to the command below.
|
||||
__ADDITIONAL_EXCLUDED_TAG__: >-
|
||||
${{
|
||||
(
|
||||
github.event_name == 'push' &&
|
||||
(
|
||||
github.ref == 'master' ||
|
||||
startsWith(github.ref, 'release-')
|
||||
) &&
|
||||
''
|
||||
) ||
|
||||
':mb/old-migrations-test'
|
||||
}}
|
||||
MB_PGVECTOR_DB_URL: 'jdbc:postgres://localhost:5432/mb_semantic_search?user=postgres&password=postgres'
|
||||
CI: 'true'
|
||||
name: "${{ matrix.version.name }} ${{ matrix.job.name }}"
|
||||
@@ -69,7 +52,224 @@ jobs:
|
||||
junit-name: ${{ matrix.version.junit-name }}
|
||||
test-args: >-
|
||||
${{ matrix.job.test-args }}
|
||||
:exclude-tags '[ ${{ matrix.job.exclude-tag }} ${{ env.__ADDITIONAL_EXCLUDED_TAG__ }}]'
|
||||
:exclude-tags '[${{ matrix.job.exclude-tag }}]'
|
||||
- name: Upload Test Results
|
||||
uses: ./.github/actions/upload-test-results
|
||||
if: always()
|
||||
with:
|
||||
input-path: ./target/junit/
|
||||
output-name: ${{ github.job }}
|
||||
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
|
||||
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
semantic-search-tests-mariadb:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 60
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
version:
|
||||
- name: MariaDB 10.2 with pgvector pg17
|
||||
junit-name: semantic-search-tests-mariadb-10-2
|
||||
mariadb-image: circleci/mariadb:10.2.23
|
||||
pgvector-image: pgvector/pgvector:pg17
|
||||
- name: MariaDB Latest with pgvector pg17
|
||||
junit-name: semantic-search-tests-mariadb-latest
|
||||
mariadb-image: circleci/mariadb:latest
|
||||
pgvector-image: pgvector/pgvector:pg17
|
||||
job:
|
||||
- name: Semantic Search Tests
|
||||
build-static-viz: false
|
||||
test-args: >-
|
||||
:only '"enterprise/backend/test/metabase_enterprise/semantic_search"'
|
||||
exclude-tag: ':mb/driver-tests'
|
||||
|
||||
services:
|
||||
pgvector:
|
||||
image: ${{ matrix.version.pgvector-image }}
|
||||
ports:
|
||||
- "5432:5432"
|
||||
env:
|
||||
POSTGRES_DB: mb_semantic_search
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: postgres
|
||||
mysql:
|
||||
image: ${{ matrix.version.mariadb-image }}
|
||||
ports:
|
||||
- "3306:3306"
|
||||
env:
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: true
|
||||
MYSQL_DATABASE: circle_test
|
||||
env:
|
||||
CI: 'true'
|
||||
DRIVERS: mysql
|
||||
MB_DB_TYPE: mysql
|
||||
MB_DB_HOST: localhost
|
||||
MB_DB_PORT: 3306
|
||||
MB_DB_DBNAME: circle_test
|
||||
MB_DB_USER: root
|
||||
MB_MYSQL_TEST_USER: root
|
||||
MB_PGVECTOR_DB_URL: 'jdbc:postgres://localhost:5432/mb_semantic_search?user=postgres&password=postgres'
|
||||
name: "${{ matrix.version.name }} ${{ matrix.job.name }}"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Test ${{ matrix.version.name }}
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
build-static-viz: ${{ matrix.job.build-static-viz }}
|
||||
junit-name: ${{ matrix.version.junit-name }}
|
||||
test-args: >-
|
||||
${{ matrix.job.test-args }}
|
||||
:exclude-tags '[${{ matrix.job.exclude-tag }}]'
|
||||
- name: Upload Test Results
|
||||
uses: ./.github/actions/upload-test-results
|
||||
if: always()
|
||||
with:
|
||||
input-path: ./target/junit/
|
||||
output-name: ${{ github.job }}
|
||||
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
|
||||
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
semantic-search-tests-mysql:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 60
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
version:
|
||||
- name: MySQL 8.0 with pgvector pg17
|
||||
junit-name: semantic-search-tests-mysql-8-0
|
||||
mysql-image: cimg/mysql:8.0
|
||||
pgvector-image: pgvector/pgvector:pg17
|
||||
- name: MySQL Latest with pgvector pg17
|
||||
junit-name: semantic-search-tests-mysql-latest
|
||||
mysql-image: mysql:latest
|
||||
pgvector-image: pgvector/pgvector:pg17
|
||||
job:
|
||||
- name: Semantic Search Tests
|
||||
build-static-viz: false
|
||||
test-args: >-
|
||||
:only '"enterprise/backend/test/metabase_enterprise/semantic_search"'
|
||||
exclude-tag: ':mb/driver-tests'
|
||||
|
||||
services:
|
||||
pgvector:
|
||||
image: ${{ matrix.version.pgvector-image }}
|
||||
ports:
|
||||
- "5432:5432"
|
||||
env:
|
||||
POSTGRES_DB: mb_semantic_search
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: postgres
|
||||
mysql:
|
||||
image: ${{ matrix.version.mysql-image }}
|
||||
ports:
|
||||
- "3306:3306"
|
||||
env:
|
||||
MYSQL_ALLOW_EMPTY_PASSWORD: true
|
||||
MYSQL_DATABASE: circle_test
|
||||
env:
|
||||
CI: 'true'
|
||||
DRIVERS: mysql
|
||||
MB_DB_TYPE: mysql
|
||||
MB_DB_HOST: localhost
|
||||
MB_DB_PORT: 3306
|
||||
MB_DB_DBNAME: circle_test
|
||||
MB_DB_USER: root
|
||||
MB_MYSQL_TEST_USER: root
|
||||
MB_PGVECTOR_DB_URL: 'jdbc:postgres://localhost:5432/mb_semantic_search?user=postgres&password=postgres'
|
||||
name: "${{ matrix.version.name }} ${{ matrix.job.name }}"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Test ${{ matrix.version.name }}
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
build-static-viz: ${{ matrix.job.build-static-viz }}
|
||||
junit-name: ${{ matrix.version.junit-name }}
|
||||
test-args: >-
|
||||
${{ matrix.job.test-args }}
|
||||
:exclude-tags '[${{ matrix.job.exclude-tag }}]'
|
||||
- name: Upload Test Results
|
||||
uses: ./.github/actions/upload-test-results
|
||||
if: always()
|
||||
with:
|
||||
input-path: ./target/junit/
|
||||
output-name: ${{ github.job }}
|
||||
bucket: ${{ vars.AWS_S3_TEST_RESULTS_BUCKET }}
|
||||
aws-access-key-id: ${{ secrets.AWS_TEST_RESULTS_ACCESS_KEY_ID }}
|
||||
aws-secret-access-key: ${{ secrets.AWS_TEST_RESULTS_SECRET_ACCESS_KEY }}
|
||||
aws-region: ${{ vars.AWS_REGION }}
|
||||
trunk-api-token: ${{ secrets.TRUNK_API_TOKEN }}
|
||||
|
||||
semantic-search-tests-postgres:
|
||||
if: ${{ !inputs.skip }}
|
||||
runs-on: ubuntu-22.04
|
||||
timeout-minutes: 60
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
version:
|
||||
- name: Postgres 12.x with pgvector pg17
|
||||
junit-name: semantic-search-tests-postgres-12
|
||||
postgres-image: postgres:12-alpine
|
||||
pgvector-image: pgvector/pgvector:pg17
|
||||
- name: Postgres Latest with pgvector pg17
|
||||
junit-name: semantic-search-tests-postgres-latest
|
||||
postgres-image: postgres:latest
|
||||
pgvector-image: pgvector/pgvector:pg17
|
||||
job:
|
||||
- name: Semantic Search Tests
|
||||
build-static-viz: false
|
||||
test-args: >-
|
||||
:only '"enterprise/backend/test/metabase_enterprise/semantic_search"'
|
||||
exclude-tag: ':mb/driver-tests'
|
||||
|
||||
services:
|
||||
pgvector:
|
||||
image: ${{ matrix.version.pgvector-image }}
|
||||
ports:
|
||||
- "5432:5432"
|
||||
env:
|
||||
POSTGRES_DB: mb_semantic_search
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: postgres
|
||||
postgres:
|
||||
image: ${{ matrix.version.postgres-image }}
|
||||
ports:
|
||||
- "5433:5432"
|
||||
env:
|
||||
POSTGRES_USER: mb_test
|
||||
POSTGRES_DB: mb_test
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
env:
|
||||
CI: 'true'
|
||||
DRIVERS: postgres
|
||||
MB_DB_TYPE: postgres
|
||||
MB_DB_PORT: 5433
|
||||
MB_DB_HOST: localhost
|
||||
MB_DB_DBNAME: mb_test
|
||||
MB_DB_USER: mb_test
|
||||
MB_POSTGRESQL_TEST_USER: mb_test
|
||||
MB_PGVECTOR_DB_URL: 'jdbc:postgres://localhost:5432/mb_semantic_search?user=postgres&password=postgres'
|
||||
name: "${{ matrix.version.name }} ${{ matrix.job.name }}"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Test ${{ matrix.version.name }}
|
||||
uses: ./.github/actions/test-driver
|
||||
with:
|
||||
build-static-viz: ${{ matrix.job.build-static-viz }}
|
||||
junit-name: ${{ matrix.version.junit-name }}
|
||||
test-args: >-
|
||||
${{ matrix.job.test-args }}
|
||||
:exclude-tags '[${{ matrix.job.exclude-tag }}]'
|
||||
- name: Upload Test Results
|
||||
uses: ./.github/actions/upload-test-results
|
||||
if: always()
|
||||
@@ -84,7 +284,10 @@ jobs:
|
||||
|
||||
semantic-search-tests-result:
|
||||
needs:
|
||||
- semantic-search-tests-pgvector
|
||||
- semantic-search-tests-h2
|
||||
- semantic-search-tests-mariadb
|
||||
- semantic-search-tests-mysql
|
||||
- semantic-search-tests-postgres
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
name: semantic-search-tests-result
|
||||
|
||||
@@ -2,7 +2,7 @@ name: Uberjar Containerize labeled
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types: [ labeled ]
|
||||
types: [ labeled, opened, synchronize, reopened ]
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
@@ -10,12 +10,12 @@ concurrency:
|
||||
|
||||
jobs:
|
||||
uberjar:
|
||||
if: ${{ github.event.label.name == 'build-docker-uberjar' }}
|
||||
if: ${{ contains(github.event.pull_request.labels.*.name, 'build-docker-uberjar') || github.event.label.name == 'build-docker-uberjar' }}
|
||||
uses: ./.github/workflows/uberjar.yml
|
||||
secrets: inherit
|
||||
|
||||
containerize:
|
||||
needs: [uberjar]
|
||||
if: ${{ github.event.label.name == 'build-docker-uberjar' }}
|
||||
if: ${{ contains(github.event.pull_request.labels.*.name, 'build-docker-uberjar') || github.event.label.name == 'build-docker-uberjar' }}
|
||||
uses: ./.github/workflows/containerize-uberjar.yml
|
||||
secrets: inherit
|
||||
|
||||
8
.gitignore
vendored
@@ -98,6 +98,13 @@ xcuserdata
|
||||
dev/src/dev/nocommit/
|
||||
dev/serialization_deltas/
|
||||
*~
|
||||
|
||||
# TypeScript compilation artifacts
|
||||
/build/
|
||||
*.tsbuildinfo
|
||||
/trace-output/
|
||||
/temp-types/
|
||||
|
||||
**/cypress_sample_database.json
|
||||
**/cypress_sample_instance_data.json
|
||||
/frontend/src/cljs
|
||||
@@ -156,3 +163,4 @@ CLAUDE.local.md
|
||||
|
||||
/logs
|
||||
/.clojure-mcp
|
||||
__pycache__/
|
||||
|
||||
4
.gitmodules
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
[submodule "python-runner"]
|
||||
path = python-runner
|
||||
url = https://github.com/metabase/python-runner-container.git
|
||||
branch = prototype
|
||||
|
After Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 69 KiB After Width: | Height: | Size: 69 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 27 KiB |
|
After Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 102 KiB |
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 107 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 167 KiB |
@@ -1 +1,5 @@
|
||||
accept = ["200..=204", "429"]
|
||||
exclude_path = ["docs/embedding/sdk"]
|
||||
no_progress = true
|
||||
include_fragments = true
|
||||
verbose = "error"
|
||||
@@ -2,4 +2,4 @@ frontend/src/cljs
|
||||
docs/configuring-metabase/environment-variables.md
|
||||
docs/api/*
|
||||
docs/api-documentation.md
|
||||
.storybook-sdk/msw-public/mockServiceWorker.js
|
||||
enterprise/frontend/src/embedding-sdk-shared/.storybook/msw-public/mockServiceWorker.js
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"extends": ["stylelint-config-standard", "stylelint-config-css-modules"],
|
||||
"plugins": ["./frontend/lint/stylelint-rules/no-base-colors.js"],
|
||||
"rules": {
|
||||
"alpha-value-notation": null,
|
||||
"color-function-notation": null,
|
||||
@@ -26,6 +27,7 @@
|
||||
"comment-empty-line-before": null,
|
||||
"selector-pseudo-element-colon-notation": null,
|
||||
"no-empty-source": null,
|
||||
"font-family-no-missing-generic-family-keyword": null
|
||||
"font-family-no-missing-generic-family-keyword": null,
|
||||
"metabase/no-base-colors": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,8 +14,7 @@
|
||||
### JavaScript/TypeScript
|
||||
|
||||
- **Lint:** `yarn lint-eslint-pure`
|
||||
- **Test:** `yarn test-unit path/to/file.unit.spec.js` or `yarn test-unit -t "pattern"`
|
||||
- **Watch:** `yarn test-unit-watch path/to/file.unit.spec.js`
|
||||
- **Test:** `yarn test-unit-keep-cljs path/to/file.unit.spec.js` or `yarn test-unit-keep-cljs -t "pattern"`
|
||||
- **Format:** `yarn prettier`
|
||||
- **Type Check:** `yarn type-check-pure`
|
||||
|
||||
|
||||
2
bb.edn
@@ -217,6 +217,8 @@
|
||||
:task (let [{:keys [arguments]} (cli/parse! (current-task))]
|
||||
(apply readability/check arguments))}
|
||||
|
||||
;; Uncomment this if you want to play with the example calculator task:
|
||||
#_#_
|
||||
-example-calculator
|
||||
{;; `:doc` is a short docstring for the task, will be listed in `./bin/mage -h` and other help info.
|
||||
;; Keep these short, they need to fit on one line in the output from `./bin/mage -h`.
|
||||
|
||||
@@ -19,13 +19,15 @@ const REPLACES_MAP = {
|
||||
"metabase-lib": "frontend/src/metabase-lib",
|
||||
"metabase-types": "frontend/src/metabase-types",
|
||||
metabase: "frontend/src/metabase",
|
||||
"embedding-sdk-package": "enterprise/frontend/src/embedding-sdk-package",
|
||||
"embedding-sdk-bundle": "enterprise/frontend/src/embedding-sdk-bundle",
|
||||
"embedding-sdk-shared": "enterprise/frontend/src/embedding-sdk-shared",
|
||||
cljs: "target/cljs_release",
|
||||
};
|
||||
|
||||
const API_EXTRACTOR_CONFIG_PATH = path.join(
|
||||
__dirname,
|
||||
"../../enterprise/frontend/src/embedding-sdk-bundle/embedding-sdk-api-extractor.json",
|
||||
"../../enterprise/frontend/src/embedding-sdk-package/embedding-sdk-api-extractor.json",
|
||||
);
|
||||
|
||||
const getLogger = (prefix) => {
|
||||
@@ -131,7 +133,7 @@ const generateDtsRollup = () => {
|
||||
const dtsRollupEntryPointPath = path.resolve(
|
||||
path.join(
|
||||
__dirname,
|
||||
"../../resources/embedding-sdk/dist/enterprise/frontend/src/embedding-sdk-bundle/index.d.ts",
|
||||
"../../resources/embedding-sdk/dist/enterprise/frontend/src/embedding-sdk-package/index.d.ts",
|
||||
),
|
||||
);
|
||||
const dtsRollupEntryPointPathExist = fs.existsSync(dtsRollupEntryPointPath);
|
||||
|
||||
@@ -36,7 +36,7 @@ function generateSdkPackage() {
|
||||
|
||||
const sdkPackageTemplateJson = fs.readFileSync(
|
||||
path.resolve(
|
||||
"./enterprise/frontend/src/embedding-sdk-bundle/package.template.json",
|
||||
"./enterprise/frontend/src/embedding-sdk-package/package.template.json",
|
||||
),
|
||||
"utf-8",
|
||||
);
|
||||
@@ -87,7 +87,7 @@ if (!fs.existsSync(SDK_DIST_DIR)) {
|
||||
|
||||
generateSdkPackage();
|
||||
copyFileToOutput("LICENSE.txt");
|
||||
copyFileToOutput("frontend/src/embedding-sdk-bundle/README.md", "README.md");
|
||||
copyFileToOutput("frontend/src/embedding-sdk-package/README.md", "README.md");
|
||||
copyFileToOutput(
|
||||
"frontend/src/embedding-sdk-bundle/CHANGELOG.md",
|
||||
"CHANGELOG.md",
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#!/bin/bash
|
||||
function update_readme() {
|
||||
sed -i -E 's|(embedding-sdk-)[0-9.]+|\1'"$1"'|' enterprise/frontend/src/embedding-sdk-bundle/README.md
|
||||
sed -i -E 's|(http://downloads.metabase.com/sdk/v)[0-9.]+|\1'"$1"'|' enterprise/frontend/src/embedding-sdk-bundle/README.md
|
||||
sed -i -E 's|(embedding-sdk-)[0-9.]+|\1'"$1"'|' enterprise/frontend/src/embedding-sdk-package/README.md
|
||||
sed -i -E 's|(http://downloads.metabase.com/sdk/v)[0-9.]+|\1'"$1"'|' enterprise/frontend/src/embedding-sdk-package/README.md
|
||||
}
|
||||
|
||||
function update_package_json_template() {
|
||||
sed -i -E 's/("version": ").*"/\1'"$1"'"/' enterprise/frontend/src/embedding-sdk-bundle/package.template.json
|
||||
sed -i -E 's/("version": ").*"/\1'"$1"'"/' enterprise/frontend/src/embedding-sdk-package/package.template.json
|
||||
}
|
||||
|
||||
$1 $2
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
#! /usr/bin/env bash
|
||||
|
||||
function prepare_files() {
|
||||
tsx ./enterprise/frontend/src/embedding-sdk-bundle/bin/generate-cli-snippets-for-testing.ts
|
||||
tsx ./enterprise/frontend/src/embedding-sdk-package/bin/generate-cli-snippets-for-testing.ts
|
||||
}
|
||||
|
||||
function install_dependencies() {
|
||||
yarn --cwd ./enterprise/frontend/src/embedding-sdk-bundle/cli-snippets-tmp/express-server install --frozen-lockfile
|
||||
yarn --cwd ./enterprise/frontend/src/embedding-sdk-package/cli-snippets-tmp/express-server install --frozen-lockfile
|
||||
}
|
||||
|
||||
function type_check() {
|
||||
tsc --project ./enterprise/frontend/src/embedding-sdk-bundle/tsconfig.cli-snippets.json
|
||||
tsc --project ./enterprise/frontend/src/embedding-sdk-package/tsconfig.cli-snippets.json
|
||||
}
|
||||
|
||||
function cleanup_files() {
|
||||
rm -rf ./enterprise/frontend/src/embedding-sdk-bundle/cli-snippets-tmp
|
||||
rm -rf ./enterprise/frontend/src/embedding-sdk-package/cli-snippets-tmp
|
||||
}
|
||||
|
||||
cleanup_files
|
||||
|
||||
14
ci-test-config.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"version": "1.0.0",
|
||||
"ignored": {
|
||||
"vars": [
|
||||
"metabase.session.models.session-test/send-email-on-first-login-from-new-device-test",
|
||||
"metabase-enterprise.impersonation.driver-test/nested-do-with-connection-with-options-test"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"last_updated": "2025-08-02",
|
||||
"updated_by": "dpsutton",
|
||||
"reason": "Two flakes: send-email-on-first-login-from-new-device-test has schema error if emails from another thread are present; nested-do-with-connection-with-options-test is causing deadlocks i believe."
|
||||
}
|
||||
}
|
||||
33
deps.edn
@@ -36,7 +36,7 @@
|
||||
com.clearspring.analytics/stream {:mvn/version "2.9.8" ; Various sketching algorithms
|
||||
:exclusions [it.unimi.dsi/fastutil
|
||||
org.slf4j/slf4j-api]}
|
||||
com.clojure-goes-fast/jvm-alloc-rate-meter{:mvn/version "0.1.4"} ; Monitor heap allocation rate.
|
||||
com.clojure-goes-fast/jvm-alloc-rate-meter {:mvn/version "0.1.4"} ; Monitor heap allocation rate.
|
||||
com.clojure-goes-fast/jvm-hiccup-meter {:mvn/version "0.1.1"} ; Monitor GC pauses and other system-induced pauses.
|
||||
com.draines/postal {:mvn/version "2.0.5" ; SMTP library
|
||||
:exclusions [com.sun.mail/jakarta.mail]}
|
||||
@@ -45,7 +45,7 @@
|
||||
com.github.albfernandez/juniversalchardet {:mvn/version "2.5.0"}
|
||||
com.github.blagerweij/liquibase-sessionlock {:mvn/version "1.6.9"} ; session lock for liquibase migrations
|
||||
com.github.jknack/handlebars ^:antq/exclude ; 4.4.0 requires java 17+
|
||||
{:mvn/version "4.3.1"} ; templating engine
|
||||
{:mvn/version "4.3.1"} ; templating engine
|
||||
com.github.oliyh/martian-clj-http {:mvn/version "0.1.31"} ; openapi client
|
||||
com.github.pangloss/transducers {:git/sha "c91d39046c8c64dc31b84ebb27154a8084fcda4c" ; like medley for transducers
|
||||
:git/url "https://github.com/pangloss/transducers"}
|
||||
@@ -55,14 +55,14 @@
|
||||
com.github.vertical-blank/sql-formatter {:mvn/version "2.0.5"} ; Java SQL formatting library https://github.com/vertical-blank/sql-formatter
|
||||
com.google.guava/guava {:mvn/version "33.4.8-jre"} ; dep for BigQuery, Spark, and GA. Require here rather than letting different dep versions stomp on each other — see comments on #9697
|
||||
com.h2database/h2 ^:antq/exclude ; https://metaboat.slack.com/archives/CKZEMT1MJ/p1727191010259979
|
||||
{:mvn/version "2.1.214"} ; embedded SQL database
|
||||
{:mvn/version "2.1.214"} ; embedded SQL database
|
||||
com.ibm.icu/icu4j {:mvn/version "77.1"} ; Used to transliterate Unicode characters into Latin characters
|
||||
com.knuddels/jtokkit {:mvn/version "1.1.0"} ; Java tokenizer library for OpenAI models, used for token counting in semantic search
|
||||
com.mchange/c3p0 {:mvn/version "0.10.1"} ; DB connection pool
|
||||
com.snowplowanalytics/snowplow-java-tracker ^:antq/exclude ; 2+ depend on apache httpclient 5.x, but saml and clj-http depend on 4.x
|
||||
{:mvn/version "1.0.1"} ; Snowplow analytics
|
||||
{:mvn/version "1.0.1"} ; Snowplow analytics
|
||||
com.sun.mail/jakarta.mail ^:antq/exclude ; 2+ changes imports from javax.mail to jakarta.mail
|
||||
{:mvn/version "1.6.8"} ; SMTP lib, required by postal
|
||||
{:mvn/version "1.6.8"} ; SMTP lib, required by postal
|
||||
com.taoensso/nippy {:mvn/version "3.6.0"} ; Fast serialization (i.e., GZIP) library for Clojure
|
||||
com.vladsch.flexmark/flexmark {:mvn/version "0.64.8"} ; Markdown parsing
|
||||
com.vladsch.flexmark/flexmark-ext-autolink
|
||||
@@ -92,7 +92,7 @@
|
||||
;; TODO: replace back to normal artifact
|
||||
io.github.metabase/macaw {:mvn/version "0.2.27"} ; Parse native SQL queries
|
||||
io.github.resilience4j/resilience4j-retry ^:antq/exclude ; 2.x do not support Java 8
|
||||
{:mvn/version "1.7.1"} ; Support for retrying operations
|
||||
{:mvn/version "1.7.1"} ; Support for retrying operations
|
||||
io.prometheus/simpleclient_hotspot {:mvn/version "0.16.0"} ; prometheus jvm collector
|
||||
junegunn/grouper {:mvn/version "0.1.1"} ; Batch processing helper
|
||||
kixi/stats {:mvn/version "0.5.7" ; Various statistic measures implemented as transducers
|
||||
@@ -118,7 +118,7 @@
|
||||
net.sf.cssbox/cssbox {:mvn/version "5.0.2" ; HTML / CSS rendering
|
||||
:exclusions [org.slf4j/slf4j-api
|
||||
junit/junit]}
|
||||
net.thisptr/jackson-jq {:mvn/version "1.4.0"} ; Java implementation of the JQ json query language
|
||||
net.thisptr/jackson-jq {:mvn/version "1.6.0"} ; Java implementation of the JQ json query language
|
||||
org.apache.commons/commons-compress {:mvn/version "1.28.0"} ; compression utils
|
||||
org.apache.commons/commons-lang3 {:mvn/version "3.18.0"} ; helper methods for working with java.lang stuff
|
||||
org.apache.logging.log4j/log4j-1.2-api {:mvn/version "2.25.1"} ; apache logging framework
|
||||
@@ -135,7 +135,7 @@
|
||||
:exclusions [org.bouncycastle/bcpkix-jdk15on
|
||||
org.bouncycastle/bcprov-jdk15on]}
|
||||
org.apache.poi/poi-ooxml-full {:mvn/version "5.4.1"}
|
||||
org.apache.sshd/sshd-core {:mvn/version "2.15.0" ; ssh tunneling and test server
|
||||
org.apache.sshd/sshd-core {:mvn/version "2.16.0" ; ssh tunneling and test server
|
||||
:exclusions [org.slf4j/slf4j-api
|
||||
org.slf4j/jcl-over-slf4j]}
|
||||
org.apache.tika/tika-core {:mvn/version "3.2.2"}
|
||||
@@ -147,7 +147,7 @@
|
||||
org.clj-commons/hickory {:mvn/version "0.7.7" ; Parse HTML into Clojure data structures
|
||||
:exclusions [org.jsoup/jsoup]}
|
||||
org.clojars.pntblnk/clj-ldap {:mvn/version "0.0.17"} ; LDAP client
|
||||
org.clojure/clojure {:mvn/version "1.12.1"}
|
||||
org.clojure/clojure {:mvn/version "1.12.2"}
|
||||
org.clojure/core.async {:mvn/version "1.7.701"
|
||||
:exclusions [org.clojure/tools.reader]}
|
||||
org.clojure/core.logic {:mvn/version "1.1.0"} ; optimized pattern matching library for Clojure
|
||||
@@ -198,6 +198,8 @@
|
||||
org.eclipse.jetty.ee9/jetty-ee9-servlet
|
||||
org.eclipse.jetty.ee9.websocket/jetty-ee9-websocket-jetty-server]}
|
||||
slingshot/slingshot {:mvn/version "0.12.2"} ; enhanced throw/catch, used by other deps
|
||||
software.amazon.awssdk/s3 {:mvn/version "2.33.0"}
|
||||
software.amazon.awssdk/sts {:mvn/version "2.33.0"} ; AWS SDK v2 for S3
|
||||
stencil/stencil {:mvn/version "0.5.0"} ; Mustache templates for Clojure
|
||||
user-agent/user-agent {:mvn/version "0.1.1"} ; User-Agent string parser, for Login History page & elsewhere
|
||||
weavejester/dependency {:mvn/version "1.0.0"} ; Dependency graphs and topological sorting
|
||||
@@ -253,9 +255,9 @@
|
||||
{:mvn/version "0.4.0"} ; Enables easy memory measurement
|
||||
com.gfredericks/test.chuck {:mvn/version "0.2.15"} ; generating strings from regexes (useful with malli)
|
||||
criterium/criterium {:mvn/version "0.4.6"} ; benchmarking library
|
||||
djblue/portal {:mvn/version "0.60.2"} ; ui for inspecting values
|
||||
djblue/portal {:mvn/version "0.61.0"} ; ui for inspecting values
|
||||
io.github.camsaul/humane-are {:mvn/version "1.0.2"} ; cleaner test output
|
||||
io.github.metabase/hawk {:sha "1fe839cfa48549e21b89c6418c747895eda7e7bc"} ; test runner
|
||||
io.github.metabase/hawk {:mvn/version "1.0.11"} ; test runner
|
||||
jonase/eastwood {:mvn/version "1.4.3" ; inspects namespaces and reports possible problems using tools.analyzer
|
||||
:exclusions
|
||||
[org.ow2.asm/asm-all]}
|
||||
@@ -409,7 +411,7 @@
|
||||
cider/piggieback {:mvn/version "0.6.0"}
|
||||
cljs-bean/cljs-bean {:mvn/version "1.9.0"}
|
||||
com.lambdaisland/glogi {:mvn/version "1.3.169"}
|
||||
io.github.metabase/hawk {:mvn/version "1.0.7"}
|
||||
io.github.metabase/hawk {:mvn/version "1.0.11"}
|
||||
org.clojars.mmb90/cljs-cache {:mvn/version "0.1.4"}
|
||||
refactor-nrepl/refactor-nrepl {:mvn/version "3.11.0"}
|
||||
;; keep it in sync with package.json
|
||||
@@ -836,8 +838,13 @@
|
||||
:test/lib
|
||||
{:exec-args {:only ["test/metabase/lib"
|
||||
"test/metabase/lib_be"]}}
|
||||
;; test the python transforms
|
||||
;; clj -X:dev:ee:ee-dev:driver:test:test/python-transform
|
||||
:test/python-transform
|
||||
{:exec-args {:only [metabase-enterprise.transforms.api-test
|
||||
"enterprise/backend/test/metabase_enterprise/transforms"]}}
|
||||
|
||||
;; test the Query Processor
|
||||
;; test the Query Processor
|
||||
;;
|
||||
;; clj -X:dev:ee:ee-dev:test:test/qp
|
||||
:test/qp
|
||||
|
||||
@@ -92,6 +92,7 @@
|
||||
(future
|
||||
#_:clj-kondo/ignore
|
||||
(println "Starting Metabase cider repl on port" port)
|
||||
(spit ".nrepl-port" port)
|
||||
(nrepl-server/start-server
|
||||
:port port
|
||||
:bind "0.0.0.0"
|
||||
|
||||
@@ -139,6 +139,12 @@ Metabase's reference documentation.
|
||||
- [Basic actions](./actions/basic.md)
|
||||
- [Custom actions](./actions/custom.md)
|
||||
|
||||
### AI
|
||||
|
||||
- [AI overview](./ai/start.md)
|
||||
- [Metabot](./ai/metabot.md)
|
||||
- [Setting up Metabot](./ai/settings.md)
|
||||
|
||||
### Exploration and organization
|
||||
|
||||
- [Organization overview](./exploration-and-organization/start.md)
|
||||
|
||||
BIN
docs/ai/images/ai-settings.png
Normal file
|
After Width: | Height: | Size: 158 KiB |
BIN
docs/ai/images/generate-sql-from-natural-language-prompt.png
Normal file
|
After Width: | Height: | Size: 402 KiB |
BIN
docs/ai/images/have-metabot-fix-it.png
Normal file
|
After Width: | Height: | Size: 151 KiB |
BIN
docs/ai/images/metabot-conversation-sidebar.png
Normal file
|
After Width: | Height: | Size: 172 KiB |
BIN
docs/ai/images/metabot-response.png
Normal file
|
After Width: | Height: | Size: 206 KiB |
BIN
docs/ai/images/metabot-writes-description.png
Normal file
|
After Width: | Height: | Size: 349 KiB |
BIN
docs/ai/images/metabot.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
100
docs/ai/metabot.md
Normal file
@@ -0,0 +1,100 @@
|
||||
---
|
||||
title: Metabot - Metabase's AI assistant
|
||||
summary: Metabot is Metabase's AI assistant that helps you analyze data, create charts, write SQL, fix errors, find content, and get answers from documentation.
|
||||
---
|
||||
|
||||
# Metabot - Metabase's AI assistant
|
||||
|
||||
{% include beta-blockquote.html
|
||||
message="For now, <a href='https://www.metabase.com/features/metabot-ai'>Metabot</a> is only available as an add-on for Pro and Enterprise plans on Metabase Cloud."
|
||||
%}
|
||||
|
||||

|
||||
|
||||
Metabot helps you analyze your data by creating charts from natural language, generating SQL queries, fixing query errors, and analyzing existing visualizations.
|
||||
|
||||
To set up Metabot, see [Metabot settings](./settings.md).
|
||||
|
||||
## What Metabot can do
|
||||
|
||||
Metabot can help you to:
|
||||
|
||||
- [Create a chart using the query builder](#how-metabot-uses-the-query-builder) from a natural language query.
|
||||
- [Generate SQL in the native editor](../questions/native-editor/writing-sql.md) from natural language. (Currently, only SQL is supported.)
|
||||
- [Analyze a chart](#analyze-charts-with-metabot).
|
||||
- [Fix errors in SQL code](#have-metabot-fix-sql-queries).
|
||||
- Answer questions from our documentation (as in, the literature you're reading right now).
|
||||
|
||||
Like with all generative AI, you'll always need to double-check results.
|
||||
|
||||
## The Metabot chat sidebar
|
||||
|
||||

|
||||
|
||||
There are multiple ways to start a chat with Metabot:
|
||||
|
||||
- Type cmd+b on Mac, ctrl+b on Windows, to open up the [chat sidebar](#the-metabot-chat-sidebar).
|
||||
- Click the Metabot icon in the search bar.
|
||||
- Type cmd+k on Mac, or ctrl+k on Windows, to open the [command palette](../exploration-and-organization/exploration.md#command-palette). Select the Metabot option to **Ask me to do something, or ask a question**.
|
||||
|
||||
You can chat with Metabot (though predictably, it's only interested in helping you answer questions about your data).
|
||||
|
||||
Metabot will keep the context of the current question with each new prompt. Only the current conversation history is saved (you can scroll up to see it). If you start a new chat, Metabase will discard the previous conversation, so be mindful when resetting the conversation.
|
||||
|
||||
Some tips:
|
||||
|
||||
- Give Metabot as much context as you can. If you know the table or fields you want to query, tell Metabot.
|
||||
- Whenever you want Metabot to do something completely different, you should reset the conversation, as Metabot might find that irrelevant historical context to be confusing.
|
||||
- Once Metabot creates a question for you, you can follow up with more questions or take over yourself. You can drill through the chart or step into the editor to tweak the query (both in the query builder and the SQL editor).
|
||||
- Metabot works best with English prompts. While it might understand other languages, you'll get the most reliable results by asking your questions in English.
|
||||
|
||||
### Metabot response menu
|
||||
|
||||
Hover over Metabot's response to:
|
||||
|
||||
- Copy the response.
|
||||
- Give thumbs-up/thumbs-down feedback on responses. If you downvote a response, you can optionally contribute a bug report to help us improve Metabot.
|
||||
- Re-run the prompt with Metabot. This is useful if you've updated the chart or just want to have Metabot take another pass (since AI responses aren't deterministic, Metabot may give a different response on another run).
|
||||
|
||||
## Analyze charts with Metabot
|
||||
|
||||

|
||||
|
||||
When viewing a question, you can click the Metabot icon in the upper right to analyze a visualization. You can also open the command palette to tell Metabot to analyze the chart.
|
||||
|
||||
When viewing a table of results, Metabase won't display the Metabot button, but you can open the chat to ask Metabot to analyze the table, and it will produce an [X-ray](../exploration-and-organization/x-rays.md) of the results.
|
||||
|
||||
You can also ask Metabot to tell you about specific tables in your database.
|
||||
|
||||
## How Metabot uses the query builder
|
||||
|
||||
When you ask Metabot to create a chart from natural language, it first looks for existing questions that might answer your request. If it finds a relevant question, it'll point you to that instead of creating something new. Otherwise, Metabot will use the [query builder](../questions/query-builder/editor.md) to create a new chart for you.
|
||||
|
||||
Keep in mind that Metabot is still learning the query builder. Metabot can only handle basic query builder operations, and it lacks access to the library of [custom expressions](../questions/query-builder/expressions-list.md). Metabot is also limited to single-level aggregation and grouping, so if you need more complex analysis, you can take over and refine the query yourself, or switch to the SQL editor.
|
||||
|
||||
## Metabot in the native editor
|
||||
|
||||

|
||||
|
||||
To have Metabot generate SQL for you:
|
||||
|
||||
1. Open the [SQL editor](../questions/native-editor/writing-sql.md).
|
||||
2. Select the database you want to query.
|
||||
3. Type cmd+b on Mac, ctrl+b on Windows, to open up the [chat sidebar](#the-metabot-chat-sidebar).
|
||||
4. Ask it to "Write a SQL query that..." and type your prompt.
|
||||
|
||||
Metabot will generate the SQL for you, but it won't run the query. This gives you a chance to inspect the code before running it. The native editor is designed to be read-only (so don't worry about Metabot dropping any tables), but you should still check the query to make sure it targets the data you want.
|
||||
|
||||
If you don't specify a specific table in a natural language question, Metabot will only check the first 100 tables in the currently selected database. If your question pertains to tables other than those first 100 tables, Metabot may hallucinate the tables it needs, and the query will fail.
|
||||
|
||||
## Have Metabot fix SQL queries
|
||||
|
||||

|
||||
|
||||
When you get an error in a SQL query, you can click the **Have Metabot fix it** button, and Metabot will try to correct the query. You can also ask Metabot to fix your SQL in the chat.
|
||||
|
||||
## Navigating after Metabot creates a chart
|
||||
|
||||
If Metabot creates a query or takes you to a new item but you want to return to the previous screen, you can navigate using your browser's back button.
|
||||
|
||||
You can also save any chart that Metabot creates to a dashboard or collection.
|
||||
91
docs/ai/settings.md
Normal file
@@ -0,0 +1,91 @@
|
||||
---
|
||||
title: Metabot settings
|
||||
summary: Configure Metabot settings, including which collections Metabot can access, and learn tips for improving Metabot's performance through data modeling and metadata.
|
||||
---
|
||||
|
||||
# Metabot settings
|
||||
|
||||
{% include beta-blockquote.html
|
||||
message="For now, <a href='https://www.metabase.com/features/metabot-ai'>Metabot</a> is only available as an add-on for Pro and Enterprise plans on Metabase Cloud."
|
||||
%}
|
||||
|
||||
_Settings > Admin settings > AI_
|
||||
|
||||
This page covers admin settings for Metabase's AI assistant, [Metabot](./metabot.md).
|
||||
|
||||
## Configure Metabot
|
||||
|
||||
To help Metabot focus on the data you care about most, select the collection containing the models and metrics you'd like it to work with.
|
||||
|
||||
## Pick a collection for Metabot to have access to
|
||||
|
||||

|
||||
|
||||
To select a collection for Metabot:
|
||||
|
||||
1. Go to **Settings** > **Admin settings** > **AI**.
|
||||
2. Click the **Collection** dropdown.
|
||||
3. Select the collection that contains the models and metrics you want Metabot to use.
|
||||
|
||||
Metabot will use the models and metrics in that collection to help answer questions and generate queries. You can change this collection at any time.
|
||||
|
||||
## Tips for making the most of Metabot
|
||||
|
||||
The best thing you can do to improve Metabot's performance is to prep your data like you would for onboarding a new (human) hire to your data. In practice, this means you should:
|
||||
|
||||
- [Add models and metrics to your Metabot collection](#add-models-and-metrics-to-your-metabot-collection)
|
||||
- [Add descriptions for your data and content](#add-descriptions-for-your-data-and-content)
|
||||
- [Make sure the semantic types for each field are correct](#make-sure-the-semantic-types-for-each-field-are-correct)
|
||||
- [Curate prompt suggestions](#curate-prompt-suggestions)
|
||||
|
||||
### Add models and metrics to your Metabot collection
|
||||
|
||||
Create models that make it easy for Metabot to find answers to the kinds of questions you expect people to ask about your data. Create metrics that capture key business calculations that people frequently need to reference. Add these models and metrics to the collection you've designated for Metabot to learn from.
|
||||
|
||||
For example, if people often ask questions about customer lifetime value (LTV), create a model that joins customer data with order history and calculates LTV. Or if people frequently need to know monthly active users (MAU), create a metric that defines exactly how MAU should be calculated.
|
||||
|
||||
### Add descriptions for your data and content
|
||||
|
||||
Add descriptions to your [models](../data-modeling/models.md#add-metadata-to-columns-in-a-model), [metrics](../data-modeling/metrics.md), [dashboards](../dashboards/introduction.md), and [questions](../questions/introduction.md). Write descriptions to provide context, define terms, and explain business logic.
|
||||
|
||||
Admins can also curate [table metadata](../data-modeling/metadata-editing.md) by adding descriptions for tables and their fields.
|
||||
|
||||
For example, here's a decent description for an ID field that provides additional context for the data:
|
||||
|
||||
```txt
|
||||
This is a unique ID for the product. It is also called the “Invoice number” or “Confirmation number” in customer facing emails and screens.
|
||||
```
|
||||
|
||||
You can even ask Metabot to write descriptions for you. But Metabot will only have access to the data in the database. It can't know things like "this ID is called the 'Invoice number' in the web app", which is the kind of contextual information worth documenting.
|
||||
|
||||
### Make sure the semantic types for each field are correct
|
||||
|
||||
Make sure the semantic types for each field accurately describe the field's "meaning". For example, if you have a field like `created_at`, you'd want the column type to be Creation date.
|
||||
|
||||
Metabase will try to set semantic types automatically, but you should confirm that each field has the relevant semantic type. See [Data types and semantic types](../data-modeling/semantic-types.md). You can also set semantic types for [models](../data-modeling/models.md#add-metadata-to-columns-in-a-model).
|
||||
|
||||
### Curate prompt suggestions
|
||||
|
||||
When you select a collection for Metabot to "learn", Metabot will suggest a series of prompts based on the content it finds in that collection. These give people a feel for the kinds of things people can ask Metabot to do.
|
||||
|
||||
Admins can run these generated prompts to test the answers, or trash the individual prompts if they're not useful or misleading. You can also regenerate all the prompts with a click.
|
||||
|
||||
## Metabot permissions are Metabase permissions
|
||||
|
||||
Metabot inherits the permissions of the current user, so you don't need to set permissions specifically for Metabot. Whenever someone uses Metabot, Metabot can only see what that person has permissions to see and do.
|
||||
|
||||
In other words, to restrict what data Metabot can see for each person, simply apply [data](../permissions/data.md) and [collection](../permissions/collections.md) permissions to their groups as you would normally, and those permissions will apply to their use of Metabot as well.
|
||||
|
||||
## Metabot is only available instance-wide, not per person
|
||||
|
||||
Currently, Metabot will be available to everyone who uses your Metabase.
|
||||
|
||||
## Metabot uses a variety of generative AI models to answer your questions
|
||||
|
||||
Under the hood, Metabase powers Metabot with a variety of generative models. For now, you can't change which generative AI models Metabot uses, as Metabase's AI service handles their selection.
|
||||
|
||||
To get the best results, we (the Metabase team) use internal benchmarks to determine which AI models Metabot should use for different tasks. And we are constantly iterating on performance, so Metabot will continue to improve over time.
|
||||
|
||||
## We don't collect or store the prompts you send to Metabot
|
||||
|
||||
Your questions and conversations remain private to your Metabase. We do collect some metadata to gauge and improve usage, but we can't see your prompt or any of your data.
|
||||
17
docs/ai/start.md
Normal file
@@ -0,0 +1,17 @@
|
||||
---
|
||||
title: "AI in Metabase"
|
||||
---
|
||||
|
||||
# AI in Metabase
|
||||
|
||||
{% include beta-blockquote.html %}
|
||||
|
||||
> For now, [Metabot](https://www.metabase.com/features/metabot-ai) is only available as an add-on for Pro and Enterprise plans on Metabase Cloud.
|
||||
|
||||
## [Metabot](./metabot.md)
|
||||
|
||||
Metabot is an AI assistant that helps you explore and analyze your data.
|
||||
|
||||
## [Setting up Metabot](./settings.md)
|
||||
|
||||
Admins can configure Metabot to focus on specific collections and manage example prompts.
|
||||
468
docs/api.html
@@ -1829,7 +1829,8 @@ redirect_from:
|
||||
},
|
||||
"schema" : {
|
||||
"anyOf" : [ {
|
||||
"type" : "string"
|
||||
"type" : "string",
|
||||
"minLength" : 1
|
||||
}, {
|
||||
"type" : "null"
|
||||
} ]
|
||||
@@ -2199,15 +2200,19 @@ redirect_from:
|
||||
"required" : [ "moved" ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.!=" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.*" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.+" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.-" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema..parameter.target" : {
|
||||
@@ -2223,21 +2228,27 @@ redirect_from:
|
||||
} ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema./" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.<" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.<=" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.=" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.>" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.>=" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.Addable" : {
|
||||
@@ -2376,6 +2387,13 @@ redirect_from:
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.today"
|
||||
} ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.Emptyable" : {
|
||||
"anyOf" : [ {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.StringExpressionArg"
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.field-or-expression-ref"
|
||||
} ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.EqualityComparable" : {
|
||||
"anyOf" : [ {
|
||||
"type" : "boolean"
|
||||
@@ -2482,7 +2500,7 @@ redirect_from:
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.case"
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.case:if"
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.if"
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.offset"
|
||||
}, {
|
||||
@@ -2703,7 +2721,7 @@ redirect_from:
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.case"
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.case:if"
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.if"
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.datetime-diff"
|
||||
}, {
|
||||
@@ -2960,7 +2978,7 @@ redirect_from:
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.case"
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.case:if"
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.if"
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.host"
|
||||
}, {
|
||||
@@ -3213,13 +3231,13 @@ redirect_from:
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.case"
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.case:if"
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.if"
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.median"
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.percentile"
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.ag:var"
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.var"
|
||||
}, {
|
||||
"$ref" : "#/components/schemas/metabase.legacy-mbql.schema.cum-count"
|
||||
}, {
|
||||
@@ -3255,43 +3273,48 @@ redirect_from:
|
||||
"$ref" : "#/components/schemas/metabase.lib.schema.parameter.widget-type"
|
||||
},
|
||||
"metabase.legacy-mbql.schema.abs" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.absolute-datetime" : {
|
||||
"oneOf" : [ { }, {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
}, {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
} ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.ag:var" : {
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.aggregation" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.aggregation-options" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.and" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.asc" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.avg" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.between" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.case" : {
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.case:if" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.ceil" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.check-keys-for-query-type" : {
|
||||
@@ -3301,91 +3324,118 @@ redirect_from:
|
||||
"description" : "`:source-metadata` is added to queries when `card__id` source queries are resolved. It contains info about the\n columns in the source query.\n\n Where this is added was changed in Metabase 0.33.0 -- previously, when `card__id` source queries were resolved, the\n middleware would add `:source-metadata` to the top-level; to support joins against source queries, this has been\n changed so it is always added at the same level the resolved `:source-query` is added.\n\n This should automatically be fixed by `normalize`; if we encounter it, it means some middleware is not functioning\n properly."
|
||||
},
|
||||
"metabase.legacy-mbql.schema.coalesce" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.concat" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.contains" : {
|
||||
"anyOf" : [ {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
}, {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
} ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.convert-timezone" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.count" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.count-where" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.cum-count" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.cum-sum" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.date" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.datetime" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.datetime-add" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.datetime-diff" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.datetime-subtract" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.day-name" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.desc" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.dimension" : {
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.distinct" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.distinct-where" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.does-not-contain" : {
|
||||
"anyOf" : [ {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
}, {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
} ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.domain" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.during" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.ends-with" : {
|
||||
"anyOf" : [ {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
}, {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
} ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.exp" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.expression" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.field" : {
|
||||
"allOf" : [ {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
}, {
|
||||
"description" : "Fields using names rather than integer IDs are required to specify `:base-type`.",
|
||||
@@ -3400,60 +3450,82 @@ redirect_from:
|
||||
} ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.float" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.floor" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.get-day" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.get-day-of-week" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.get-hour" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.get-minute" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.get-month" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.get-quarter" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.get-second" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.get-week" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.get-year" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.helpers.distinct" : {
|
||||
"description" : "values must be distinct"
|
||||
},
|
||||
"metabase.legacy-mbql.schema.host" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.if" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.in" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.inside" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.integer" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.interval" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.is-empty" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.is-null" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.legacy-column-metadata" : {
|
||||
@@ -3500,148 +3572,199 @@ redirect_from:
|
||||
"required" : [ "base_type", "display_name", "name" ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.length" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.log" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.lower" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.ltrim" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.max" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.median" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.metric" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.min" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.month-name" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.no-binning-options-at-top-level" : { },
|
||||
"metabase.legacy-mbql.schema.not" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.not-empty" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.not-in" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.not-null" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.now" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.offset" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.or" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.path" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.percentile" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.power" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.quarter-name" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.regex-match-first" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.relative-datetime" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.relative-time-interval" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.replace" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.require-base-type-for-field-name" : { },
|
||||
"metabase.legacy-mbql.schema.round" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.rtrim" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.segment" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.share" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.split-part" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.sqrt" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.starts-with" : {
|
||||
"anyOf" : [ {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
}, {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
} ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.stddev" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.subdomain" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.substring" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.sum" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.sum-where" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.template-tag" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.temporal-extract" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.text" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.time" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.time-interval" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.today" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.trim" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.upper" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.validate-temporal-unit" : { },
|
||||
"metabase.legacy-mbql.schema.value" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.var" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.legacy-mbql.schema.variable" : {
|
||||
"description" : "schema for a valid legacy MBQL :tag clause",
|
||||
"allOf" : [ ]
|
||||
},
|
||||
"metabase.lib.schema.actions.row" : {
|
||||
@@ -4639,7 +4762,7 @@ redirect_from:
|
||||
},
|
||||
"metabase.lib.schema.temporal-bucketing.unit" : {
|
||||
"type" : "string",
|
||||
"enum" : [ "quarter", "day", "hour", "week", "second", "default", "day-of-week", "hour-of-day", "month", "month-of-year", "day-of-month", "year", "day-of-year", "millisecond", "year-of-era", "second-of-minute", "week-of-year", "quarter-of-year", "minute-of-hour", "minute" ]
|
||||
"enum" : [ "day", "day-of-month", "day-of-week", "day-of-year", "default", "hour", "hour-of-day", "millisecond", "minute", "minute-of-hour", "month", "month-of-year", "quarter", "quarter-of-year", "second", "second-of-minute", "week", "week-of-year", "year", "year-of-era" ]
|
||||
},
|
||||
"metabase.logger.api.log-level" : {
|
||||
"type" : "string",
|
||||
@@ -5422,40 +5545,34 @@ redirect_from:
|
||||
"metabase.warehouses.api.available-settings" : {
|
||||
"type" : "object",
|
||||
"additionalProperties" : {
|
||||
"oneOf" : [ {
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
"enabled" : {
|
||||
"const" : true
|
||||
}
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
"enabled" : {
|
||||
"type" : "boolean"
|
||||
},
|
||||
"required" : [ "enabled" ]
|
||||
}, {
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
"enabled" : {
|
||||
"const" : false
|
||||
},
|
||||
"reasons" : {
|
||||
"type" : "array",
|
||||
"items" : {
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
"key" : {
|
||||
"type" : "string"
|
||||
},
|
||||
"message" : {
|
||||
"anyOf" : [ {
|
||||
"type" : "string"
|
||||
}, { } ]
|
||||
}
|
||||
"reasons" : {
|
||||
"type" : "array",
|
||||
"items" : {
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
"key" : {
|
||||
"type" : "string"
|
||||
},
|
||||
"required" : [ "key", "message" ]
|
||||
}
|
||||
"message" : {
|
||||
"anyOf" : [ {
|
||||
"type" : "string"
|
||||
}, { } ]
|
||||
},
|
||||
"type" : {
|
||||
"type" : "string",
|
||||
"enum" : [ "error", "warning" ]
|
||||
}
|
||||
},
|
||||
"required" : [ "key", "type", "message" ]
|
||||
}
|
||||
},
|
||||
"required" : [ "enabled", "reasons" ]
|
||||
} ]
|
||||
}
|
||||
},
|
||||
"required" : [ "enabled" ]
|
||||
}
|
||||
},
|
||||
"metabot.reaction.redirect" : {
|
||||
@@ -11395,7 +11512,7 @@ redirect_from:
|
||||
} ],
|
||||
"responses" : {
|
||||
"2XX" : {
|
||||
"description" : "map where {:settings -> <map from <keyword> to <one of <true = map where {:enabled -> <must equal true>} | false = map where {:enabled -> <must equal false>, :reasons -> <sequence of map where {:key -> <keyword>, :message -> <string, or function>}>}> dispatched by :enabled>>}",
|
||||
"description" : "map where {:settings -> <map from <keyword> to <map where {:enabled -> <boolean>, :reasons (optional) -> <sequence of map where {:key -> <keyword>, :type -> <enum of :error, :warning>, :message -> <string, or function>}>}>>}",
|
||||
"content" : {
|
||||
"application/json" : {
|
||||
"schema" : {
|
||||
@@ -12487,6 +12604,48 @@ redirect_from:
|
||||
"tags" : [ "/api/ee/billing" ]
|
||||
}
|
||||
},
|
||||
"/api/ee/cloud-add-ons/{product-type}" : {
|
||||
"post" : {
|
||||
"summary" : "POST /api/ee/cloud-add-ons/{product-type}",
|
||||
"description" : "Purchase an add-on.",
|
||||
"parameters" : [ {
|
||||
"in" : "path",
|
||||
"name" : "product-type",
|
||||
"required" : true,
|
||||
"schema" : {
|
||||
"type" : "string",
|
||||
"enum" : [ "metabase-ai" ]
|
||||
}
|
||||
} ],
|
||||
"responses" : {
|
||||
"2XX" : {
|
||||
"description" : "Successful response"
|
||||
},
|
||||
"4XX" : {
|
||||
"description" : "Client error response"
|
||||
},
|
||||
"5XX" : {
|
||||
"description" : "Server error response"
|
||||
}
|
||||
},
|
||||
"requestBody" : {
|
||||
"content" : {
|
||||
"application/json" : {
|
||||
"schema" : {
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
"terms_of_service" : {
|
||||
"type" : "boolean"
|
||||
}
|
||||
},
|
||||
"required" : [ "terms_of_service" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags" : [ "/api/ee/cloud-add-ons" ]
|
||||
}
|
||||
},
|
||||
"/api/ee/content-translation/csv" : {
|
||||
"get" : {
|
||||
"summary" : "GET /api/ee/content-translation/csv",
|
||||
@@ -12598,6 +12757,30 @@ redirect_from:
|
||||
"description" : "Server error response"
|
||||
}
|
||||
},
|
||||
"requestBody" : {
|
||||
"content" : {
|
||||
"application/json" : {
|
||||
"schema" : {
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
"replicationSchemaFilters" : {
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
"schema-filters-patterns" : {
|
||||
"type" : "string"
|
||||
},
|
||||
"schema-filters-type" : {
|
||||
"type" : "string",
|
||||
"enum" : [ "inclusion", "exclusion", "all" ]
|
||||
}
|
||||
},
|
||||
"required" : [ "schema-filters-type", "schema-filters-patterns" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags" : [ "/api/ee/database-replication" ]
|
||||
},
|
||||
"delete" : {
|
||||
@@ -12627,6 +12810,58 @@ redirect_from:
|
||||
"tags" : [ "/api/ee/database-replication" ]
|
||||
}
|
||||
},
|
||||
"/api/ee/database-replication/connection/{database-id}/preview" : {
|
||||
"post" : {
|
||||
"summary" : "POST /api/ee/database-replication/connection/{database-id}/preview",
|
||||
"description" : "Return info about pg-replication connection that is about to be created.",
|
||||
"parameters" : [ {
|
||||
"in" : "path",
|
||||
"name" : "database-id",
|
||||
"required" : true,
|
||||
"schema" : {
|
||||
"type" : "integer",
|
||||
"minimum" : 1
|
||||
},
|
||||
"description" : "value must be an integer greater than zero."
|
||||
} ],
|
||||
"responses" : {
|
||||
"2XX" : {
|
||||
"description" : "Successful response"
|
||||
},
|
||||
"4XX" : {
|
||||
"description" : "Client error response"
|
||||
},
|
||||
"5XX" : {
|
||||
"description" : "Server error response"
|
||||
}
|
||||
},
|
||||
"requestBody" : {
|
||||
"content" : {
|
||||
"application/json" : {
|
||||
"schema" : {
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
"replicationSchemaFilters" : {
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
"schema-filters-patterns" : {
|
||||
"type" : "string"
|
||||
},
|
||||
"schema-filters-type" : {
|
||||
"type" : "string",
|
||||
"enum" : [ "inclusion", "exclusion", "all" ]
|
||||
}
|
||||
},
|
||||
"required" : [ "schema-filters-type", "schema-filters-patterns" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tags" : [ "/api/ee/database-replication" ]
|
||||
}
|
||||
},
|
||||
"/api/ee/database-routing/destination-database" : {
|
||||
"post" : {
|
||||
"summary" : "POST /api/ee/database-routing/destination-database",
|
||||
@@ -14602,6 +14837,9 @@ redirect_from:
|
||||
"metabot_id" : {
|
||||
"type" : "string"
|
||||
},
|
||||
"profile_id" : {
|
||||
"type" : "string"
|
||||
},
|
||||
"state" : {
|
||||
"type" : "object",
|
||||
"properties" : { }
|
||||
@@ -14655,6 +14893,9 @@ redirect_from:
|
||||
"metabot_id" : {
|
||||
"type" : "string"
|
||||
},
|
||||
"profile_id" : {
|
||||
"type" : "string"
|
||||
},
|
||||
"state" : {
|
||||
"type" : "object",
|
||||
"properties" : { }
|
||||
@@ -15623,7 +15864,35 @@ redirect_from:
|
||||
"get" : {
|
||||
"summary" : "GET /api/ee/transform-job/",
|
||||
"description" : "Get all transform jobs.",
|
||||
"parameters" : [ ],
|
||||
"parameters" : [ {
|
||||
"in" : "query",
|
||||
"name" : "last_run_start_time",
|
||||
"required" : false,
|
||||
"schema" : {
|
||||
"type" : "string",
|
||||
"minLength" : 1
|
||||
}
|
||||
}, {
|
||||
"in" : "query",
|
||||
"name" : "next_run_start_time",
|
||||
"required" : false,
|
||||
"schema" : {
|
||||
"type" : "string",
|
||||
"minLength" : 1
|
||||
}
|
||||
}, {
|
||||
"in" : "query",
|
||||
"name" : "transform_tag_ids",
|
||||
"required" : false,
|
||||
"schema" : {
|
||||
"type" : "array",
|
||||
"items" : {
|
||||
"description" : "value must be an integer greater or equal to than zero.",
|
||||
"type" : "integer",
|
||||
"minimum" : 0
|
||||
}
|
||||
}
|
||||
} ],
|
||||
"responses" : {
|
||||
"2XX" : {
|
||||
"description" : "Successful response"
|
||||
@@ -15777,6 +16046,34 @@ redirect_from:
|
||||
"tags" : [ "/api/ee/transform-job" ]
|
||||
}
|
||||
},
|
||||
"/api/ee/transform-job/{job-id}/transforms" : {
|
||||
"get" : {
|
||||
"summary" : "GET /api/ee/transform-job/{job-id}/transforms",
|
||||
"description" : "Get the transforms of job specified by the job's ID.",
|
||||
"parameters" : [ {
|
||||
"in" : "path",
|
||||
"name" : "job-id",
|
||||
"required" : true,
|
||||
"schema" : {
|
||||
"type" : "integer",
|
||||
"minimum" : 1
|
||||
},
|
||||
"description" : "value must be an integer greater than zero."
|
||||
} ],
|
||||
"responses" : {
|
||||
"2XX" : {
|
||||
"description" : "Successful response"
|
||||
},
|
||||
"4XX" : {
|
||||
"description" : "Client error response"
|
||||
},
|
||||
"5XX" : {
|
||||
"description" : "Server error response"
|
||||
}
|
||||
},
|
||||
"tags" : [ "/api/ee/transform-job" ]
|
||||
}
|
||||
},
|
||||
"/api/ee/transform-tag/" : {
|
||||
"post" : {
|
||||
"summary" : "POST /api/ee/transform-tag/",
|
||||
@@ -16025,6 +16322,33 @@ redirect_from:
|
||||
"minimum" : 0
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"in" : "query",
|
||||
"name" : "start_time",
|
||||
"required" : false,
|
||||
"schema" : {
|
||||
"type" : "string",
|
||||
"minLength" : 1
|
||||
}
|
||||
}, {
|
||||
"in" : "query",
|
||||
"name" : "end_time",
|
||||
"required" : false,
|
||||
"schema" : {
|
||||
"type" : "string",
|
||||
"minLength" : 1
|
||||
}
|
||||
}, {
|
||||
"in" : "query",
|
||||
"name" : "run_methods",
|
||||
"required" : false,
|
||||
"schema" : {
|
||||
"type" : "array",
|
||||
"items" : {
|
||||
"type" : "string",
|
||||
"enum" : [ "manual", "cron" ]
|
||||
}
|
||||
}
|
||||
} ],
|
||||
"responses" : {
|
||||
"2XX" : {
|
||||
@@ -16180,6 +16504,34 @@ redirect_from:
|
||||
"tags" : [ "/api/ee/transform" ]
|
||||
}
|
||||
},
|
||||
"/api/ee/transform/{id}/dependencies" : {
|
||||
"get" : {
|
||||
"summary" : "GET /api/ee/transform/{id}/dependencies",
|
||||
"description" : "Get the dependencies of a specific transform.",
|
||||
"parameters" : [ {
|
||||
"in" : "path",
|
||||
"name" : "id",
|
||||
"required" : true,
|
||||
"schema" : {
|
||||
"type" : "integer",
|
||||
"minimum" : 1
|
||||
},
|
||||
"description" : "value must be an integer greater than zero."
|
||||
} ],
|
||||
"responses" : {
|
||||
"2XX" : {
|
||||
"description" : "Successful response"
|
||||
},
|
||||
"4XX" : {
|
||||
"description" : "Client error response"
|
||||
},
|
||||
"5XX" : {
|
||||
"description" : "Server error response"
|
||||
}
|
||||
},
|
||||
"tags" : [ "/api/ee/transform" ]
|
||||
}
|
||||
},
|
||||
"/api/ee/transform/{id}/run" : {
|
||||
"post" : {
|
||||
"summary" : "POST /api/ee/transform/{id}/run",
|
||||
@@ -22463,7 +22815,7 @@ redirect_from:
|
||||
"/api/setup/" : {
|
||||
"post" : {
|
||||
"summary" : "POST /api/setup/",
|
||||
"description" : "Special endpoint for creating the first user during setup. This endpoint both creates the user AND logs them in and\n returns a session ID. This endpoint can also be used to add a database, create and invite a second admin, and/or\n set specific settings from the setup flow.",
|
||||
"description" : "Special endpoint for creating the first user during setup. This endpoint both creates the user AND logs them in and\n returns a session ID. This endpoint can also be used to set specific settings from the setup flow.",
|
||||
"parameters" : [ ],
|
||||
"responses" : {
|
||||
"2XX" : {
|
||||
@@ -22482,23 +22834,6 @@ redirect_from:
|
||||
"schema" : {
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
"invite" : {
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
"email" : {
|
||||
"description" : "value must be a valid email address.",
|
||||
"type" : "string"
|
||||
},
|
||||
"first_name" : {
|
||||
"type" : "string",
|
||||
"minLength" : 1
|
||||
},
|
||||
"last_name" : {
|
||||
"type" : "string",
|
||||
"minLength" : 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"prefs" : {
|
||||
"type" : "object",
|
||||
"properties" : {
|
||||
@@ -24330,6 +24665,11 @@ redirect_from:
|
||||
"type" : "object",
|
||||
"additionalProperties" : { }
|
||||
},
|
||||
"source" : {
|
||||
"type" : "string",
|
||||
"minLength" : 1,
|
||||
"default" : "admin"
|
||||
},
|
||||
"user_group_memberships" : {
|
||||
"type" : "array",
|
||||
"items" : {
|
||||
|
||||
@@ -14,7 +14,7 @@ Managing billing and accounts in the Metabase Store.
|
||||
|
||||
## Try out a free 14-day trial of Pro
|
||||
|
||||
If you're on a [Starter](/product/starter) cloud plan, you can try out [all the features of Metabase Pro](/product/pro) for free for 14 days with no commitment.
|
||||
If you're on a [Starter](https://www.metabase.com/product/starter) cloud plan, you can try out [all the features of Metabase Pro](https://www.metabase.com/product/pro) for free for 14 days with no commitment.
|
||||
|
||||
If you want to stick with Pro, you'll have the chance to upgrade. Otherwise, your plan will automatically switch back to Starter.
|
||||
|
||||
@@ -62,7 +62,7 @@ To cancel a Starter or Pro plan directly in the Metabase Store:
|
||||
|
||||
1. Log in to your Metabase [Store account](https://store.metabase.com).
|
||||
2. Go to **Instances**.
|
||||
3. Under the instance with the subscription that you want to cancel, click **Cancel subscription and delete instance**. If you're on an Enterprise plan, you'll need to [contact support](/help-premium).
|
||||
3. Under the instance with the subscription that you want to cancel, click **Cancel subscription and delete instance**. If you're on an Enterprise plan, you'll need to [contact support](https://www.metabase.com/help-premium).
|
||||
|
||||
## Update payment information
|
||||
|
||||
@@ -93,7 +93,7 @@ Note that you cannot switch back to monthly billing until your annual cycle has
|
||||
|
||||
## W-9 form requests
|
||||
|
||||
See Metabase's updated [W9 form](/files/2024_W9_signed.pdf).
|
||||
See Metabase's updated [W9 form](https://www.metabase.com/files/2024_W9_signed.pdf).
|
||||
|
||||
## Update your Tax ID
|
||||
|
||||
@@ -109,7 +109,7 @@ The primary account holder should request a name change by emailing [billing@met
|
||||
|
||||
## Reset your Admin password
|
||||
|
||||
If you need to reset your Admin password, [contact support](/help-premium).
|
||||
If you need to reset your Admin password, [contact support](https://www.metabase.com/help-premium).
|
||||
|
||||
## Change your company name
|
||||
|
||||
@@ -142,7 +142,7 @@ If you need to change your primary account holder, for example if your primary a
|
||||
|
||||
## Move from Metabase Cloud to self-hosting Metabase
|
||||
|
||||
If you're on Metabase Cloud but need to switch to hosting Metabase yourself, [contact us](/help-premium) and we'll give you a backup of your application database that you can use to restore Metabase on your own infrastructure.
|
||||
If you're on Metabase Cloud but need to switch to hosting Metabase yourself, [contact us](https://www.metabase.com/help-premium) and we'll give you a backup of your application database that you can use to restore Metabase on your own infrastructure.
|
||||
|
||||
## Further reading
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ layout: new-docs
|
||||
|
||||
# Metabase Cloud versus self-hosting
|
||||
|
||||
We have a post that goes into more depth on [why Metabase Cloud might be right for you](/blog/why-metabase-cloud), but here's a (nonexhaustive) table listing some of the differences between Metabase Cloud and self-hosting Metabase.
|
||||
We have a post that goes into more depth on [why Metabase Cloud might be right for you](https://www.metabase.com/blog/why-metabase-cloud), but here's a (nonexhaustive) table listing some of the differences between Metabase Cloud and self-hosting Metabase.
|
||||
|
||||
| | Self-hosted OSS | Metabase Cloud |
|
||||
| ------------------------------ | ----------------------------------- | ------------------ |
|
||||
@@ -38,7 +38,7 @@ There are some cases where you _should_ self-host.
|
||||
- You have some regulations that stipulate how you run your software (like HIPAA).
|
||||
- You want to run a custom build of Metabase. That is, you’re running a fork of Metabase (OSS or the Enterprise/Pro version) so you can add your own customizations to the software, and you have the engineering resources to tank that level of overhead.
|
||||
- You want to use a community or custom driver. We only support [official databases](../databases/connecting.md#connecting-to-supported-databases) on Metabase Cloud, because we need to be able to vouch for their quality and help you with problems in a production context.
|
||||
- You need an air-gapped environment, usually for regulatory compliance, or if you’re running your own three-letter-agency… If you’re not sure if you need an air-gapped environment, you don’t need an air-gapped environment. If you do need an air-gap, we have an [air-gap offering as well](/product/air-gapping) (just not for Cloud, obviously).
|
||||
- You need an air-gapped environment, usually for regulatory compliance, or if you’re running your own three-letter-agency… If you’re not sure if you need an air-gapped environment, you don’t need an air-gapped environment. If you do need an air-gap, we have an [air-gap offering as well](https://www.metabase.com/product/air-gapping) (just not for Cloud, obviously).
|
||||
|
||||
Otherwise, you're better off having us handle all of the overhead so you can focus on your business. The official support alone is probably worth it.
|
||||
|
||||
@@ -46,7 +46,7 @@ Otherwise, you're better off having us handle all of the overhead so you can foc
|
||||
|
||||
Metabase also has a paid version that ships with all of the bells and whistles (SSO, row-level permissions, customization, and a lot more). Plans with this version include:
|
||||
|
||||
- [Metabase Pro](/product/pro)
|
||||
- [Metabase Enterprise](/product/enterprise)
|
||||
- [Metabase Pro](https://www.metabase.com/product/pro)
|
||||
- [Metabase Enterprise](https://www.metabase.com/product/enterprise)
|
||||
|
||||
You can self-host this paid version, or have have us host it for you on Metabase Cloud for no additional cost. We don't charge more because we believe you'll have such a better experience that it'll be easier for us to support you.
|
||||
|
||||
@@ -19,18 +19,18 @@ When you sign up for a paid Metabase plan on our website, you can elect to pay i
|
||||
|
||||
Both billing frequencies include a flat monthly or annual payment, and bill additional [user accounts](#what-counts-as-a-user-account) each month on a prorated basis (or quarterly, if you're [paying by invoice](#how-invoicing-works-for-pro-plans)).
|
||||
|
||||
Companies with large number of users can talk to sales about our [Enterprise plan](/sales/), which includes more options and discounts.
|
||||
Companies with large number of users can talk to sales about our [Enterprise plan](https://www.metabase.com/sales/), which includes more options and discounts.
|
||||
|
||||
## How monthly billing works
|
||||
|
||||
Though we bill you monthly, we calculate how much you owe each day. So, say you're on the [Starter plan](/pricing/). Your monthly bill would include:
|
||||
Though we bill you monthly, we calculate how much you owe each day. So, say you're on the [Starter plan](https://www.metabase.com/pricing/). Your monthly bill would include:
|
||||
|
||||
- $85 flat payment for the month. This payment additionally covers the first five people who use your Metabase that month. If you have fewer than five people using your Metabase, your bill will still be $85 that month.
|
||||
- Each additional person costs \$5, prorated for how many days their [accounts were available](#what-counts-as-a-user-account) that month. So if an account only existed for the last 10 days of your 30 day billing period, you'd only be charged for those 10 days, not for the full 30 days. Same goes if you deactivated an account prior to the end of the billing period, you'll only be charged for the days when the account was available for use during that billing period. Basically, you only ever pay for all accounts in your Metabase that haven't been deactivated yet.
|
||||
|
||||
## How annual billing works
|
||||
|
||||
Paying up front for a year will save you 10%. So, again let's use the [Starter plan](/pricing/) as an example. With annual billing, you will:
|
||||
Paying up front for a year will save you 10%. So, again let's use the [Starter plan](https://www.metabase.com/pricing/) as an example. With annual billing, you will:
|
||||
|
||||
- Have an annual payment of $918. That payment additionally covers five user accounts. This flat payment is made up front; it's not billed monthly. If you have fewer than five accounts, you still pay $918 for the year.
|
||||
- For each additional user account above those first five user accounts, you'll be billed at $54, prorated for the year. So, for example, if you start out with just the first five accounts that are included in the initial $918 annual payment, then decide to add another user account six months into your annual billing cycle, you'll only be charged $27 dollars for that account, as you'll only need to pay for the remaining six months. When the annual billing cycle repeats, you'll be charged $918 for the first five users, plus \$54 for that additional user (and any other additional users you've added in the interim).
|
||||
|
||||
@@ -12,7 +12,7 @@ redirect_from:
|
||||
|
||||
# Limitation of Metabase Cloud
|
||||
|
||||
There are some limitations that could impact your migration to Metabase Cloud. These limitations apply to all [Metabase Cloud plans](/pricing/).
|
||||
There are some limitations that could impact your migration to Metabase Cloud. These limitations apply to all [Metabase Cloud plans](https://www.metabase.com/pricing/).
|
||||
|
||||
## Metabase Cloud only supports official databases
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ section: Migrate
|
||||
|
||||
Migration from Metabase Cloud to self-hosted will keep all of your questions, dashboards, people, settings --- everything in your existing Metabase.
|
||||
|
||||
To migrate, you'll need to [contact our success team](/help-premium) to get a snapshot of your Metabase's [application database](../../installation-and-operation/migrating-from-h2.md#metabases-application-database). This application database contains information about all the settings, questions, dashboards, models, users, etc from your Metabase Cloud instance. The application database is distinct from any of the databases you have connected to your Metabase. You'll need to host your own PostgreSQL database and import your data by restoring from this snapshot of your application database.
|
||||
To migrate, you'll need to [contact our success team](https://www.metabase.com/help-premium) to get a snapshot of your Metabase's [application database](../../installation-and-operation/migrating-from-h2.md#metabases-application-database). This application database contains information about all the settings, questions, dashboards, models, users, etc from your Metabase Cloud instance. The application database is distinct from any of the databases you have connected to your Metabase. You'll need to host your own PostgreSQL database and import your data by restoring from this snapshot of your application database.
|
||||
|
||||
## Preparing to migrate from cloud to self-hosted
|
||||
|
||||
@@ -31,7 +31,7 @@ A self-hosted Metabase comes with a built-in H2 application database (H2 is a fi
|
||||
|
||||
We recommend using PostgreSQL as your application database, but you can use MySQL or MariaDB as well. Before starting the migration from Metabase Cloud, [configure the application database](../../installation-and-operation/configuring-application-database.md) for your self-hosted instance.
|
||||
|
||||
For more on why you should use PostgreSQL as your application database, check out [How to run Metabase in production](/learn/metabase-basics/administration/administration-and-operation/metabase-in-production).
|
||||
For more on why you should use PostgreSQL as your application database, check out [How to run Metabase in production](https://www.metabase.com/learn/metabase-basics/administration/administration-and-operation/metabase-in-production).
|
||||
|
||||
### If you're on a Pro plan, you'll need to switch to a self-hosted Pro plan
|
||||
|
||||
@@ -42,7 +42,7 @@ If you're migrating from a Metabase Cloud Pro plan to a self-hosted Pro plan, yo
|
||||
|
||||
## How to migrate from Metabase Cloud to a self-hosted instance
|
||||
|
||||
1. **Request a snapshot of your application database** for your Metabase Cloud instance by [contacting our Success Engineering team](/help-premium).
|
||||
1. **Request a snapshot of your application database** for your Metabase Cloud instance by [contacting our Success Engineering team](https://www.metabase.com/help-premium).
|
||||
|
||||
Currently, you can't generate the snapshot yourself. A Metabase Success Engineer will generate a snapshot for you and email a link to download your snapshot from the Metabase Store.
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ Before executing the migration script, you may need to set the environment varia
|
||||
|
||||
The script will upload your application data to your new Metabase Cloud instance. If all goes well, the script will print `Done!`.
|
||||
|
||||
If anything goes sideways, follow any prompts the script outputs. If you're still stuck, [send us an email](/help/) and we'll help you troubleshoot.
|
||||
If anything goes sideways, follow any prompts the script outputs. If you're still stuck, [send us an email](https://www.metabase.com/help/) and we'll help you troubleshoot.
|
||||
|
||||
## After migrating to Metabase Cloud
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ Once the snapshot upload completes:
|
||||
|
||||
While Metabase prepping the migration, click on the **Go to Metabase Store** button to sign in to or set up your account.
|
||||
|
||||
Choose your plan: [Starter](/product/starter) or [Pro](/product/pro). You can choose monthly or annual billing (annual will save you 10%).
|
||||
Choose your plan: [Starter](https://www.metabase.com/product/starter) or [Pro](https://www.metabase.com/product/pro). You can choose monthly or annual billing (annual will save you 10%).
|
||||
|
||||
Choose your deployment: you can specify your DNS alias and select your hosting region.
|
||||
|
||||
@@ -93,4 +93,4 @@ If you were self-hosting via a third-party, be sure to clean up and cancel any s
|
||||
|
||||
## Need help?
|
||||
|
||||
If you run into any trouble, just [send us an email](/help/).
|
||||
If you run into any trouble, just [send us an email](https://www.metabase.com/help/).
|
||||
|
||||
@@ -50,7 +50,7 @@ Current customers can add storage through the Metabase Store:
|
||||
|
||||
## Metabase Cloud Storage pricing
|
||||
|
||||
Pricing depends on how much data you need to store. See the Storage section on our [pricing page](/pricing/).
|
||||
Pricing depends on how much data you need to store. See the Storage section on our [pricing page](https://www.metabase.com/pricing/).
|
||||
|
||||
## Increasing Metabase Cloud Storage
|
||||
|
||||
|
||||
@@ -69,7 +69,6 @@ config:
|
||||
settings:
|
||||
admin-email: null
|
||||
aggregated-query-row-limit: null
|
||||
ai-service-base-url: http://localhost:8000
|
||||
allowed-iframe-hosts: |-
|
||||
youtube.com,
|
||||
youtu.be,
|
||||
@@ -118,20 +117,8 @@ config:
|
||||
db-connection-timeout-ms: 10000
|
||||
db-query-timeout-minutes: 20
|
||||
default-maps-enabled: true
|
||||
disable-cors-on-localhost: false
|
||||
download-row-limit: null
|
||||
ee-ai-features-enabled: false
|
||||
ee-embedding-model: Snowflake/snowflake-arctic-embed-l-v2.0
|
||||
ee-embedding-model-dimensions: 1024
|
||||
ee-embedding-provider: ai-service
|
||||
ee-openai-api-base-url: https://api.openai.com
|
||||
ee-openai-api-key: null
|
||||
ee-openai-model: gpt-4-turbo-preview
|
||||
ee-search-gate-max-batch-size: 512
|
||||
ee-search-gate-write-timeout: 5
|
||||
ee-search-indexer-exit-early-cold-duration: 30
|
||||
ee-search-indexer-lag-tolerance-multiplier: 2
|
||||
ee-search-indexer-max-run-duration: 60
|
||||
ee-search-indexer-poll-limit: 1000
|
||||
email-from-address: notifications@metabase.com
|
||||
email-from-address-override: notifications@metabase.com
|
||||
email-from-name: null
|
||||
@@ -148,7 +135,7 @@ config:
|
||||
email-smtp-username: null
|
||||
email-smtp-username-override: null
|
||||
embedding-app-origins-interactive: null
|
||||
embedding-app-origins-sdk: localhost:*
|
||||
embedding-app-origins-sdk: ''
|
||||
embedding-homepage: hidden
|
||||
embedding-secret-key: null
|
||||
enable-embedding-interactive: false
|
||||
@@ -221,7 +208,6 @@ config:
|
||||
notification-link-base-url: null
|
||||
notification-system-event-thread-pool-size: 5
|
||||
notification-thread-pool-size: 3
|
||||
openai-max-tokens-per-batch: 4000
|
||||
persisted-model-refresh-cron-schedule: 0 0 0/6 * * ? *
|
||||
persisted-models-enabled: false
|
||||
premium-embedding-token: null
|
||||
@@ -256,9 +242,6 @@ config:
|
||||
sdk-encryption-validation-key: null
|
||||
search-language: null
|
||||
search-typeahead-enabled: true
|
||||
semantic-search-enabled: true
|
||||
semantic-search-min-results-threshold: 100
|
||||
semantic-search-results-limit: 1000
|
||||
send-email-on-first-login-from-new-device: true
|
||||
send-new-sso-user-admin-email: null
|
||||
session-cookie-samesite: lax
|
||||
@@ -271,7 +254,6 @@ config:
|
||||
show-homepage-data: true
|
||||
show-homepage-xrays: true
|
||||
show-metabase-links: true
|
||||
show-metabot: true
|
||||
show-static-embed-terms: true
|
||||
site-locale: en
|
||||
site-name: Metabase
|
||||
@@ -282,7 +264,6 @@ config:
|
||||
source-address-header: X-Forwarded-For
|
||||
sql-jdbc-fetch-size: 500
|
||||
ssh-heartbeat-interval-sec: 180
|
||||
stale-index-retention-hours: 24
|
||||
start-of-week: sunday
|
||||
subscription-allowed-domains: null
|
||||
surveys-enabled: true
|
||||
|
||||
@@ -71,13 +71,6 @@ Maximum number of rows to return for aggregated queries via the API.
|
||||
|
||||
Must be less than 1048575. See also MB_UNAGGREGATED_QUERY_ROW_LIMIT.
|
||||
|
||||
### `MB_AI_SERVICE_BASE_URL`
|
||||
|
||||
- Type: string
|
||||
- Default: `http://localhost:8000`
|
||||
|
||||
URL for the a AI Service.
|
||||
|
||||
### `MB_ALLOWED_IFRAME_HOSTS`
|
||||
|
||||
- Type: string
|
||||
@@ -400,6 +393,15 @@ Timeout in minutes for databases query execution, both Metabase application data
|
||||
|
||||
Whether or not the default GeoJSON maps are enabled.
|
||||
|
||||
### `MB_DISABLE_CORS_ON_LOCALHOST`
|
||||
|
||||
- Type: boolean
|
||||
- Default: `false`
|
||||
- [Exported as](../installation-and-operation/serialization.md): `disable-cors-on-localhost`.
|
||||
- [Configuration file name](./config-file.md): `disable-cors-on-localhost`
|
||||
|
||||
Prevents the server from sending CORS headers for requests originating from localhost.
|
||||
|
||||
### `MB_DOWNLOAD_ROW_LIMIT`
|
||||
|
||||
- Type: positive-integer
|
||||
@@ -408,118 +410,6 @@ Whether or not the default GeoJSON maps are enabled.
|
||||
|
||||
Row limit in file exports excluding the header. Enforces 1048575 excluding header as minimum. xlsx downloads are inherently limited to 1048575 rows even if this limit is higher.
|
||||
|
||||
### `MB_EE_AI_FEATURES_ENABLED`
|
||||
|
||||
- Type: boolean
|
||||
- Default: `false`
|
||||
- [Configuration file name](./config-file.md): `ee-ai-features-enabled`
|
||||
|
||||
Enable AI features.
|
||||
|
||||
This feature is experimental.
|
||||
|
||||
### `MB_EE_EMBEDDING_MODEL`
|
||||
|
||||
- Type: string
|
||||
- Default: `Snowflake/snowflake-arctic-embed-l-v2.0`
|
||||
- [Configuration file name](./config-file.md): `ee-embedding-model`
|
||||
|
||||
Set the embedding model for the selected provider.
|
||||
|
||||
This feature is experimental.
|
||||
|
||||
### `MB_EE_EMBEDDING_MODEL_DIMENSIONS`
|
||||
|
||||
- Type: positive-integer
|
||||
- Default: `1024`
|
||||
- [Configuration file name](./config-file.md): `ee-embedding-model-dimensions`
|
||||
|
||||
Set the dimension size for the selected embedding model.
|
||||
|
||||
This feature is experimental.
|
||||
|
||||
### `MB_EE_EMBEDDING_PROVIDER`
|
||||
|
||||
- Type: string
|
||||
- Default: `ai-service`
|
||||
- [Configuration file name](./config-file.md): `ee-embedding-provider`
|
||||
|
||||
The embedding provider to use (:openai, :ollama, or :ai-service).
|
||||
|
||||
This feature is experimental.
|
||||
|
||||
### `MB_EE_OPENAI_API_BASE_URL`
|
||||
|
||||
- Type: string
|
||||
- Default: `https://api.openai.com`
|
||||
- [Configuration file name](./config-file.md): `ee-openai-api-base-url`
|
||||
|
||||
The OpenAI embeddings base URL used in Metabase Enterprise.
|
||||
|
||||
This feature is experimental.
|
||||
|
||||
### `MB_EE_OPENAI_API_KEY`
|
||||
|
||||
- Type: string
|
||||
- Default: `null`
|
||||
- [Configuration file name](./config-file.md): `ee-openai-api-key`
|
||||
|
||||
The OpenAI API Key used in Metabase Enterprise.
|
||||
|
||||
This feature is experimental.
|
||||
|
||||
### `MB_EE_OPENAI_MODEL`
|
||||
|
||||
- Type: string
|
||||
- Default: `gpt-4-turbo-preview`
|
||||
- [Configuration file name](./config-file.md): `ee-openai-model`
|
||||
|
||||
The OpenAI Model (e.g. 'gpt-4', 'gpt-3.5-turbo').
|
||||
|
||||
This feature is experimental.
|
||||
|
||||
### `MB_EE_SEARCH_GATE_MAX_BATCH_SIZE`
|
||||
|
||||
- Type: integer
|
||||
- Default: `512`
|
||||
|
||||
The maximum number of documents that can be sent to `gate-documents!` without causing an error.
|
||||
|
||||
### `MB_EE_SEARCH_GATE_WRITE_TIMEOUT`
|
||||
|
||||
- Type: integer
|
||||
- Default: `5`
|
||||
|
||||
Timeout of gate write statements in seconds. Used to determine lag tolerance of the indexer (see the metabase-enterprise.semantic-search.gate/poll) in conjunction with `ee-search-indexer-lag-tolerance-multiplier`.
|
||||
|
||||
### `MB_EE_SEARCH_INDEXER_EXIT_EARLY_COLD_DURATION`
|
||||
|
||||
- Type: integer
|
||||
- Default: `30`
|
||||
|
||||
Number of seconds indexer should wait to see new data before yielding back to quartz.
|
||||
|
||||
### `MB_EE_SEARCH_INDEXER_LAG_TOLERANCE_MULTIPLIER`
|
||||
|
||||
- Type: integer
|
||||
- Default: `2`
|
||||
|
||||
Multiplier for computation of metabase-enterprise.semantic-search.indexer/lag-tolerance. The formula is `ee-search-gate-write-timeout * ee-search-indexer-lag-tolerance-multiplier`.
|
||||
|
||||
### `MB_EE_SEARCH_INDEXER_MAX_RUN_DURATION`
|
||||
|
||||
- Type: integer
|
||||
- Default: `60`
|
||||
|
||||
Number of minutes we expect to run the indexer loop for before yielding to quartz.
|
||||
|
||||
### `MB_EE_SEARCH_INDEXER_POLL_LIMIT`
|
||||
|
||||
- Type: integer
|
||||
- Default: `1000`
|
||||
|
||||
Indexer poll limit.
|
||||
|
||||
### `MB_EMAIL_FROM_ADDRESS`
|
||||
|
||||
- Type: string
|
||||
@@ -681,7 +571,7 @@ Allow these space delimited origins to embed Metabase interactive.
|
||||
> Only available on Metabase [Pro](https://www.metabase.com/product/pro) and [Enterprise](https://www.metabase.com/product/enterprise) plans.
|
||||
|
||||
- Type: string
|
||||
- Default: `localhost:*`
|
||||
- Default: ``
|
||||
- [Configuration file name](./config-file.md): `embedding-app-origins-sdk`
|
||||
|
||||
Allow Metabase SDK access to these space delimited origins.
|
||||
@@ -1359,15 +1249,6 @@ If Metabase stops sending notifications like alerts, it may be because long-runn
|
||||
queries are clogging the notification queue. You may be able to unclog the queue by
|
||||
increasing the size of the thread pool dedicated to notifications.
|
||||
|
||||
### `MB_OPENAI_MAX_TOKENS_PER_BATCH`
|
||||
|
||||
- Type: integer
|
||||
- Default: `4000`
|
||||
|
||||
The maximum number of tokens sent in a single embedding API call.
|
||||
|
||||
The maximum number of tokens sent in a single embedding API call.
|
||||
|
||||
### `MB_PERSISTED_MODEL_REFRESH_CRON_SCHEDULE`
|
||||
|
||||
- Type: string
|
||||
@@ -1680,31 +1561,6 @@ When using the appdb engine against postgresql, override the language used for s
|
||||
|
||||
Enable typeahead search in the Metabase navbar?
|
||||
|
||||
### `MB_SEMANTIC_SEARCH_ENABLED`
|
||||
|
||||
- Type: boolean
|
||||
- Default: `true`
|
||||
|
||||
Enable the semantic search engine? Intended as a kill switch for the semantic search feature while dogfooding.
|
||||
|
||||
### `MB_SEMANTIC_SEARCH_MIN_RESULTS_THRESHOLD`
|
||||
|
||||
- Type: integer
|
||||
- Default: `100`
|
||||
|
||||
Minimum number of semantic search results required before falling back to other engines.
|
||||
|
||||
Minimum number of semantic search results required before falling back to other engines.
|
||||
|
||||
### `MB_SEMANTIC_SEARCH_RESULTS_LIMIT`
|
||||
|
||||
- Type: integer
|
||||
- Default: `1000`
|
||||
|
||||
Maximum number of results to return from a single semantic search query.
|
||||
|
||||
Maximum number of results to return from a single semantic search query.
|
||||
|
||||
### `MB_SEND_EMAIL_ON_FIRST_LOGIN_FROM_NEW_DEVICE`
|
||||
|
||||
- Type: boolean
|
||||
@@ -1823,17 +1679,6 @@ Whether or not to display x-ray suggestions on the homepage. They will also be h
|
||||
|
||||
Whether or not to display Metabase links outside admin settings.
|
||||
|
||||
### `MB_SHOW_METABOT`
|
||||
|
||||
> Only available on Metabase [Pro](https://www.metabase.com/product/pro) and [Enterprise](https://www.metabase.com/product/enterprise) plans.
|
||||
|
||||
- Type: boolean
|
||||
- Default: `true`
|
||||
- [Exported as](../installation-and-operation/serialization.md): `show-metabot`.
|
||||
- [Configuration file name](./config-file.md): `show-metabot`
|
||||
|
||||
Enables Metabot character on the home page.
|
||||
|
||||
### `MB_SHOW_STATIC_EMBED_TERMS`
|
||||
|
||||
- Type: boolean
|
||||
@@ -1934,15 +1779,6 @@ Fetch size for result sets. We want to ensure that the jdbc ResultSet objects ar
|
||||
|
||||
Controls how often the heartbeats are sent when an SSH tunnel is established (in seconds).
|
||||
|
||||
### `MB_STALE_INDEX_RETENTION_HOURS`
|
||||
|
||||
- Type: integer
|
||||
- Default: `24`
|
||||
|
||||
Number of hours to retain stale semantic search indexes before cleanup.
|
||||
|
||||
Number of hours to retain stale semantic search indexes before cleanup.
|
||||
|
||||
### `MB_START_OF_WEEK`
|
||||
|
||||
- Type: keyword
|
||||
|
||||
@@ -11,7 +11,7 @@ Metabase logs quite a bit of information by default. Metabase uses [Log4j 2](htt
|
||||
|
||||
## View and download Metabase logs
|
||||
|
||||
You can find Metabase logs in **Admin settings** > **Troubleshooting** > **Logs**. You can filter the logs by keywords (for example, "sync") and download them as a text file.
|
||||
You can find Metabase logs in **Admin settings** > **Tools** > **Logs**. You can filter the logs by keywords (for example, "sync") and download them as a text file.
|
||||
|
||||
If you're running self-hosted Metabase, you'll also be able see the logs in the terminal.
|
||||
|
||||
@@ -25,7 +25,7 @@ Metabase uses [log4j](https://logging.apache.org/log4j/2.x/)for logging configur
|
||||
|
||||
### Temporary override logging configuration
|
||||
|
||||
To temporarily adjust the logging configuration, go to **Admin settings** > **Troubleshooting** > **Logs** and click on **Customize log levels**.
|
||||
To temporarily adjust the logging configuration, go to **Admin settings** > **Tools** > **Logs** and click on **Customize log levels**.
|
||||
|
||||
You can select from log level presets for common troubleshooting tasks (for example, troubleshooting sync issues), or provide your own configuration as a JSON. For example, here's an override configuration that increases logging for troubleshooting linked filters:
|
||||
|
||||
|
||||
@@ -311,7 +311,7 @@ If your Metabase administrator has enabled [public sharing](../embedding/public-
|
||||
|
||||

|
||||
|
||||
Public links can be viewed by anyone, even if they don't have access to Metabase. You can also use the public embedding code to embed your question or dashboard in a simple web page or blog post. Check out examples of simple apps with embedded dashboards in our [embedding-reference-apps repository](https://github.com/metabase/embedding-reference-apps). To learn more about [embedding](../embedding/introduction.md), check out our article on [How to use Metabase to deliver analytics to your customers](/learn/metabase-basics/embedding/overview), as well as an article on how to combine branding, Single Sign-On, full app embedding, and row and column security to deliver [multi-tenant, self-service analytics](https://www.metabase.com/learn/metabase-basics/embedding/multi-tenant-self-service-analytics).
|
||||
Public links can be viewed by anyone, even if they don't have access to Metabase. You can also use the public embedding code to embed your question or dashboard in a simple web page or blog post. Check out examples of simple apps with embedded dashboards in our [embedding-reference-apps repository](https://github.com/metabase/embedding-reference-apps). To learn more about [embedding](../embedding/introduction.md), check out our article on [How to use Metabase to deliver analytics to your customers](https://www.metabase.com/learn/metabase-basics/embedding/overview), as well as an article on how to combine branding, Single Sign-On, full app embedding, and row and column security to deliver [multi-tenant, self-service analytics](https://www.metabase.com/learn/metabase-basics/embedding/multi-tenant-self-service-analytics).
|
||||
|
||||
## Exporting results from a dashboard
|
||||
|
||||
|
||||
@@ -16,6 +16,10 @@ Here you can [sync the database schema and rescan field values](../sync-scan.md)
|
||||
|
||||
You can edit these settings at any time (and remember to save your changes).
|
||||
|
||||
### Connection string
|
||||
|
||||
Paste a connection string here to pre-fill the remaining fields below.
|
||||
|
||||
### Display name
|
||||
|
||||
The display name for the database in the Metabase interface.
|
||||
|
||||
@@ -44,6 +44,10 @@ Here you can [sync the database schema and rescan field values](../sync-scan.md)
|
||||
|
||||
You can edit these settings at any time. Just remember to save your changes.
|
||||
|
||||
### Connection string
|
||||
|
||||
Paste a connection string here to pre-fill the remaining fields below.
|
||||
|
||||
### Display name
|
||||
|
||||
The display name for the database in the Metabase interface.
|
||||
|
||||
@@ -19,6 +19,10 @@ Here you can [sync the database schema and rescan field values](../sync-scan.md)
|
||||
|
||||
To access or modify your database connection settings, click the **Edit connection details** button.
|
||||
|
||||
### Connection string
|
||||
|
||||
Paste a connection string here to pre-fill the remaining fields below.
|
||||
|
||||
### Display name
|
||||
|
||||
The display name for the database in the Metabase interface.
|
||||
|
||||
@@ -10,6 +10,10 @@ You can edit these settings at any time. Just remember to save your changes.
|
||||
|
||||
## Edit connection details
|
||||
|
||||
### Connection string
|
||||
|
||||
Paste a connection string here to pre-fill the remaining fields below.
|
||||
|
||||
### Display name
|
||||
|
||||
The display name for the database in the Metabase interface.
|
||||
|
||||
@@ -12,6 +12,10 @@ To add a database connection, click on the **gear** icon in the top right, and n
|
||||
|
||||
Fill out the fields for that database, and click **Save changes** at the bottom. You can edit these settings at any time. Just remember to save your changes.
|
||||
|
||||
### Connection string
|
||||
|
||||
Paste a connection string here to pre-fill the remaining fields below.
|
||||
|
||||
### Display name
|
||||
|
||||
The display name for the database in the Metabase interface.
|
||||
|
||||
@@ -18,6 +18,10 @@ Metabase supports the oldest supported version of Maria DB through the latest st
|
||||
|
||||
You can edit these settings at any time. Just remember to save your changes.
|
||||
|
||||
### Connection string
|
||||
|
||||
Paste a connection string here to pre-fill the remaining fields below.
|
||||
|
||||
### Display name
|
||||
|
||||
The display name for the database in the Metabase interface.
|
||||
|
||||
@@ -18,6 +18,10 @@ Metabase supports the oldest supported version through the latest stable version
|
||||
|
||||
You can edit these settings at any time. Just remember to save your changes.
|
||||
|
||||
### Connection string
|
||||
|
||||
Paste a connection string here to pre-fill the remaining fields below.
|
||||
|
||||
### Display name
|
||||
|
||||
The display name for the database in the Metabase interface.
|
||||
|
||||
@@ -16,6 +16,10 @@ Metabase supports the oldest supported version through the latest stable version
|
||||
|
||||
You can edit these settings at any time. Just remember to save your changes.
|
||||
|
||||
### Connection string
|
||||
|
||||
Paste a connection string here to pre-fill the remaining fields below.
|
||||
|
||||
### Display name
|
||||
|
||||
The display name for the database in the Metabase interface.
|
||||
|
||||
@@ -30,6 +30,10 @@ Here you can [sync the database schema and rescan field values](../sync-scan.md)
|
||||
|
||||
You can edit these settings at any time. Just remember to save your changes.
|
||||
|
||||
### Connection string
|
||||
|
||||
Paste a connection string here to pre-fill the remaining fields below.
|
||||
|
||||
### Display name
|
||||
|
||||
The display name for the database in the Metabase interface.
|
||||
|
||||
@@ -12,6 +12,10 @@ Fill out the fields for that database, and click **Save changes** at the bottom.
|
||||
|
||||
You can edit these settings at any time. Just remember to save your changes.
|
||||
|
||||
### Connection string
|
||||
|
||||
Paste a connection string here to pre-fill the remaining fields below.
|
||||
|
||||
### Display name
|
||||
|
||||
The display name for the database in the Metabase interface.
|
||||
|
||||